PHP in_array不会检查所有情况

时间:2014-12-28 00:28:36

标签: php arrays

我正在使用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>';



    ?>

3 个答案:

答案 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]