PHP:使用 if 语句从数组中取消设置
PHP: unset from array using if statement
我正在尝试使用 if 语句取消设置特定值。
我的密码是
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
for ($i = 0 ; $i < count($fruits); $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
我期待 return
Array
(
[4] => pineapple
)
但是结果是
Array
(
[3] => banana
[4] => pineapple
)
为什么 'banana' 没有从数组中取消设置?
因为删除前 3 个元素后 $i
值为 3 但数组的计数为 2 所以 for 循环中断 - 记住循环条件是 在每个迭代。对此进行更改将为您提供所需的输出:
$size = count($fruits)
for ($i = 0 ; $i < $size; $i++){
一般来说,不推荐使用 unset
和 for
整数索引循环
我认为问题是 $i<count($fruits)
。它减少了数组的大小。所以它只运行了 3 次。所以首先将数组大小分配给变量。
<?php
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$n=count($fruits);
for ($i = 0 ; $i <$n ; $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
?>
我建议您使用 foreach
而不是 for loop
。请尝试下面的代码。
<?php
$fruitss = ['apple', 'orange', 'melon', 'banana', 'pineapple','h'];
foreach ($fruitss as $key=>$fruits) {
//echo $fruits;
if ($fruits == 'apple' || $fruits == 'orange' || $fruits == 'melon' || $fruits == 'banana') {
unset($fruitss[$key]);
}
}
print_r($fruitss);
?>
正如他们所说,去罗马有很多方法..
使用foreach()
更简洁的方法是使用 foreach
而不是 for
循环,并使用 in_array()
检查数组而不是单独检查所有水果。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
foreach ($fruits as $key=>$fruit) {
if (in_array($fruit, ['apple', 'orange', 'melon', 'banana'])) {
unset($fruits[$key]);
}
}
print_r($fruits);
使用array_filter()
一种更 "fancy" 的方法是使用 array_filter()
,
的单行
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$fruits = array_filter($fruits, function($fruit) {
return !in_array($fruit, ['apple', 'orange', 'melon', 'banana']);
});
print_r($fruits);
使用array_diff()
更简单,使用 array_diff()
,它会找到仅存在于一个数组中的所有元素(基本上删除重复项)。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$result = array_diff($fruits, $remove);
使用array_intersect()
还有 array_intersect
,这是 array_diff()
的倒数。这将找到存在于两个数组中的元素,并且 return that.
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$find = ['pineapple'];
$result = array_intersect($fruits, $find);
在 PHP 中有很多方法可以做到这一点,因为 PHP 有非常丰富的数组和字符串函数。
在此回答中,讨论了两种方法。
基本上,您想从数组中删除元素。
因此,使用另一个包含要删除的元素的数组。
找出你的数组和新数组之间的区别。
不同的肯定是你意料中的结果。
您可以使用array_diff()
这种方法的优点在于:
您可以用最少的代码行来完成,而且不需要循环。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$test = array_diff($fruits, $remove);
echo '<pre>';print_r($test);echo '</pre>';
输出:
Array
(
[4] => pineapple
)
甚至使用 array_interset()
获取一个临时数组,其中包含您希望在数组中保留的唯一元素。
获取数组相交元素。
您将删除所有其他元素。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$two = ['pineapple'];
$test2 = array_intersect($fruits, $two);
echo '<pre>';print_r($test2);echo '</pre>';
输出:
Array
(
[4] => pineapple
)
问题出在 count($fruits) 上,因为每个循环数组都变小了。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$count = count($fruits);
for ($i = 0; $i < $count; $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
希望对您有所帮助!
使用这个:
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$fruit_num = count($fruits);
for ($i = 0 ; $i < $fruit_num; $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
而不是:
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
for ($i = 0 ; $i < count($fruits); $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
输出:
Array ( [4] => pineapple )
我正在尝试使用 if 语句取消设置特定值。 我的密码是
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
for ($i = 0 ; $i < count($fruits); $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
我期待 return
Array
(
[4] => pineapple
)
但是结果是
Array
(
[3] => banana
[4] => pineapple
)
为什么 'banana' 没有从数组中取消设置?
因为删除前 3 个元素后 $i
值为 3 但数组的计数为 2 所以 for 循环中断 - 记住循环条件是 在每个迭代。对此进行更改将为您提供所需的输出:
$size = count($fruits)
for ($i = 0 ; $i < $size; $i++){
一般来说,不推荐使用 unset
和 for
整数索引循环
我认为问题是 $i<count($fruits)
。它减少了数组的大小。所以它只运行了 3 次。所以首先将数组大小分配给变量。
<?php
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$n=count($fruits);
for ($i = 0 ; $i <$n ; $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
?>
我建议您使用 foreach
而不是 for loop
。请尝试下面的代码。
<?php
$fruitss = ['apple', 'orange', 'melon', 'banana', 'pineapple','h'];
foreach ($fruitss as $key=>$fruits) {
//echo $fruits;
if ($fruits == 'apple' || $fruits == 'orange' || $fruits == 'melon' || $fruits == 'banana') {
unset($fruitss[$key]);
}
}
print_r($fruitss);
?>
正如他们所说,去罗马有很多方法..
使用foreach()
更简洁的方法是使用 foreach
而不是 for
循环,并使用 in_array()
检查数组而不是单独检查所有水果。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
foreach ($fruits as $key=>$fruit) {
if (in_array($fruit, ['apple', 'orange', 'melon', 'banana'])) {
unset($fruits[$key]);
}
}
print_r($fruits);
使用array_filter()
一种更 "fancy" 的方法是使用 array_filter()
,
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$fruits = array_filter($fruits, function($fruit) {
return !in_array($fruit, ['apple', 'orange', 'melon', 'banana']);
});
print_r($fruits);
使用array_diff()
更简单,使用 array_diff()
,它会找到仅存在于一个数组中的所有元素(基本上删除重复项)。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$result = array_diff($fruits, $remove);
使用array_intersect()
还有 array_intersect
,这是 array_diff()
的倒数。这将找到存在于两个数组中的元素,并且 return that.
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$find = ['pineapple'];
$result = array_intersect($fruits, $find);
在 PHP 中有很多方法可以做到这一点,因为 PHP 有非常丰富的数组和字符串函数。
在此回答中,讨论了两种方法。
基本上,您想从数组中删除元素。
因此,使用另一个包含要删除的元素的数组。
找出你的数组和新数组之间的区别。
不同的肯定是你意料中的结果。
您可以使用array_diff()
这种方法的优点在于:
您可以用最少的代码行来完成,而且不需要循环。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$test = array_diff($fruits, $remove);
echo '<pre>';print_r($test);echo '</pre>';
输出:
Array
(
[4] => pineapple
)
甚至使用 array_interset()
获取一个临时数组,其中包含您希望在数组中保留的唯一元素。
获取数组相交元素。
您将删除所有其他元素。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$two = ['pineapple'];
$test2 = array_intersect($fruits, $two);
echo '<pre>';print_r($test2);echo '</pre>';
输出:
Array
(
[4] => pineapple
)
问题出在 count($fruits) 上,因为每个循环数组都变小了。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$count = count($fruits);
for ($i = 0; $i < $count; $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
希望对您有所帮助!
使用这个:
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$fruit_num = count($fruits);
for ($i = 0 ; $i < $fruit_num; $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
而不是:
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
for ($i = 0 ; $i < count($fruits); $i++){
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
unset($fruits[$i]);
}
}
print_r($fruits);
输出:
Array ( [4] => pineapple )