我正在使用in_array
检查从PHP中的数组中删除值,因为某些原因它不想检查exclude array
的整个长度。运行此代码会从阵列中删除道奇条目,但不会删除丰田,为什么会这样?
<?php
$inventory = array(
'0' => Array
(
'car_name' => 'Dodge',
'set_name' => 'A',
'edition' => 'B41',
'location' => 'Houston'
),
'1' => Array
(
'car_name' => 'Dodge',
'set_name' => 'A',
'edition' => 'B41',
'location' => 'Houston'
),
'2' => Array
(
'car_name' => 'Dodge',
'set_name' => 'A',
'edition' => 'B41',
'location' => 'Houston'
),
'3' => Array
(
'car_name' => 'Dodge',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'4' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'5' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'6' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'7' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'8' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'9' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'10' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
'11' => Array
(
'car_name' => 'Toyota',
'set_name' => 'A',
'edition' => 'VarA31',
'location' => 'Houston'
),
);
$exclude = array('Dodge','Toyota');
for($k=0; $k<sizeof($inventory); $k++)
{
if(in_array(trim($inventory[$k]['car_name']), $exclude))
{ unset($inventory[$k]);}
}
$inventory = array_values($inventory);
echo '<pre>';
print_r($inventory);
echo '</pre>';
?>
答案 0 :(得分:1)
您的问题是,从枚举数组中取消设置元素会调整数组的大小,但是使用sizeof()
进行测试以查看是否应该退出循环,因此每次迭代时都会减少数量值留待测试。
$exclude = array('Dodge','Toyota');
$size = sizeof($inventory);
for($k=0; $size; $k++) {
if(in_array(trim($inventory[$k]['car_name']), $exclude)) {
unset($inventory[$k]);
}
}
$inventory = array_values($inventory);
echo '<pre>';
print_r($inventory);
echo '</pre>';
答案 1 :(得分:1)
您正在迭代数组中的index:value对。因此,在取消设置值后,索引位置不匹配甚至不存在。
尝试将您需要的值复制到一个新的空数组中,如下所示:
$exclude = array('Dodge','Toyota');
$filtered = array();
for($k=0; $k<sizeof($inventory); $k++){
if(in_array(trim($inventory[$k]['car_name']), $exclude)){
// dont do this because it is changing the count of elements in the array unset($inventory[$k]);
} else {
$filtered[] = $inventory[$k]; // push the desired values into a new array
}
}
echo '<pre>';
print_r($filtered); // this should have the values that don't have 'Dodge' or 'Toyota'
echo '</pre>';
编辑:马克的答案是最好的方法,因为它也是更好的表现明智
答案 2 :(得分:1)
使用foreach
代替for($k=0; $k<sizeof($inventory); $k++)
:
foreach($inventory as $k => $row)
这是因为当您取消设置$inventory
时,您会跳过元素
$k
= 0,sizeof($inventory)
= 12,您取消设置其中一项$k++
。 $inventory[1]
变为$inventory[0]
$k
= 1,sizeof($inventory)
现在为11,您检查$inventory[1]
但不是$inventory[0]
(以前称为$inventory[1]
)