array_filter返回意外结果

时间:2012-01-24 23:43:56

标签: php arrays array-filter

我有一个如下所示的数组:

Array
(
[0] => Array
    (
        [pizza] => Calzone
        [votes] => 1
        [id] => 1
    )

[1] => Array
    (
        [pizza] => Margherita
        [votes] => 5
        [id] => 2
    )

[2] => Array
    (
        [pizza] => Pepperoni
        [votes] => 9
        [id] => 3
    )

[3] => Array
    (
        [pizza] => Quattro Formaggi
        [votes] => 3
        [id] => 4
    )

[4] => Array
    (
        [pizza] => Sloppy Giuseppe
        [votes] => 7
        [id] => 5
    )

)

当我这样做时:

function getPizza () {
    $id = 3;

    return array_filter($myArrayAsAbove, function ($arr) use ($id) {
        return ($arr['id'] == $id);
    });
}

我明白了:

[2] => Array
    (
        [pizza] => Pepperoni
        [votes] => 9
        [id] => 3
    )

我确信这是正确的,但我真的很喜欢这个:

[0] => Array
    (
        [pizza] => Pepperoni
        [votes] => 9
        [id] => 3
    )

请注意0而不是2

有人可以帮我找到解决方案,如果你真的很好,请解释一下为什么会发生这种情况,以及如何解决这个问题 - 所以下次我会知道!

4 个答案:

答案 0 :(得分:3)

array_filter保留数组键。如果您不想要它们,array_values只会为您提供“包装在新数组中”的值:

return array_values(array_filter($pizzen, function ($arr) use ($id) {
    return $arr['id'] == $id;
}));

答案 1 :(得分:0)

array_filter()的文档具体说:

  

保留数组键。

如果要重置密钥,请使用类似array_merge()的内容

function getPizza () { 
    $id = 3; 

    return array_merge(array_filter($myArrayAsAbove, function ($arr) use ($id) { 
        return ($arr['id'] == $id); 
    })); 
} 

答案 2 :(得分:0)

function getPizza () { 
    $id = 3; 

    return array_values(array_filter($myArrayAsAbove, function ($arr) use ($id) { 
        return ($arr['id'] == $id)); 
    })); 
} 

array_values重新索引数组。

答案 3 :(得分:0)

您可以使用array_values()重新创建索引:

return array_values(array_filter($myArrayAsAbove, function ($arr) use ($id) {
    return ($arr['id'] == $id);
}));