2012-01-24 110 views
0

我有一个数组,看起来像这样: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

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

+1

这是因为作为['array_filter'文档(http://php.net/manual/en/function.array-filter.php )说,数组键被保存。由于Pepperoni在原始矩阵中具有关键字2,因此它将该关键字保留在返回的矩阵中。 –

回答

3

array_filter保持数组键。如果你不想让他们,array_values只给你“包裹在一个新的数组”的价值观:

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

为array_filter()的文档特别说:

阵列密钥将被保留。

如果你想重置键,使用类似array_merge()以及

function getPizza() { 
    $id = 3; 

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

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

array_values重新索引数组。

0

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

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