我试图排除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
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);
正如另一个答案所提到的,如果你只想提取一个";列";,则CCD_ 4是一个简单得多的选项。
试试这个代码
$data= [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
$ids = array_column($data, 0);
var_dump($ids);
筛选函数需要为每个项返回一个布尔值(或任何可以强制为true的值),以便对其进行保留。因此,在您的情况下,对于数组中的每个元素,它总是返回true
要想得到结果,你必须走一走;
$data = [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
array_walk($data, function($value, $key) use ($data){
$data[$key] = $value[0];
})
因此,如果你想找到一个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);
输出
阵列(1){[1] =>阵列(2){[0]=>int(2)[1] =>string(5)"test2"}}
尝试以下代码
$data= [
0 => [1, 'test1'],
1 => [2, 'test2'],
2 => [3, 'test3'],
];
$ids = array_map(function($item) {
return $item[0];
}, $data);
var_dump($ids);