我正在尝试排除foreach循环并使用数组函数重构它们。我假设下面的代码会给我一个包含源数组中所有第一项的结果。
<?php
$data= [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
$ids = array_filter($data, function($item) {
return $item[0];
});
var_dump($ids);
但是当我得到var_dump $ids
时,我得到了输出:
array (size=3)
0 =>
array (size=2)
0 => int 1
1 => string 'test1' (length=5)
1 =>
array (size=2)
0 => int 2
1 => string 'test2' (length=5)
2 =>
array (size=2)
0 => int 3
1 => string 'test3' (length=5)
为什么输出不是:
array (size=3)
0 => int 1
1 => int 2
2 => int 3
答案 0 :(得分:9)
array_filter
用于根据数组是否满足某个标准来过滤掉数组元素。因此,您创建一个返回true或false的函数,并针对它测试数组的每个元素。您的函数将始终返回true,因为每个数组都包含第一个元素,因此数组不会更改。
您正在寻找的是array_map
,它通过在其上运行回调来修改数组中的每个元素。
<?php
$data= [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
$ids = array_map(function($item) {
return $item[0];
}, $data);
var_dump($ids);
答案 1 :(得分:4)
试试此代码
$data= [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
$ids = array_column($data, 0);
var_dump($ids);
答案 2 :(得分:1)
尝试以下代码
$data= [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
$ids = array_map(function($item) {
return $item[0];
}, $data);
var_dump($ids);
答案 3 :(得分:1)
filter函数需要为每个项返回一个布尔值(或任何可以强制转换为true的值),以便可以保留它。因此,在您的情况下,它总是对数组中的每个元素都返回true
要获得结果,您必须使用array_walk;
$data = [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
array_walk($data, function($value, $key) use ($data){
$data[$key] = $value[0];
})
答案 4 :(得分:0)
array_filter中包含的函数必须返回true或false。 0或空数组转换为FALSE。非零数字被认为是真实的。
所以如果你想找到一个id为2的项目,你应该把它与2这样比较
<?php
$data= [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
$ids = array_filter($data, function($item) {
return $item[0] == 2;
});
var_dump($ids);
输出
array(1) { [1] => array(2) { [0] => int(2) [1] => string(5) "test2" } }