Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP数组\从数组中仅获取一个值的筛选器_Php_Arrays - Fatal编程技术网

PHP数组\从数组中仅获取一个值的筛选器

PHP数组\从数组中仅获取一个值的筛选器,php,arrays,Php,Arrays,我试图排除foreach循环,并用数组函数重构它们。我假设下面的代码会给出源数组中所有第一项的结果 <?php $data= [ 0 => [1, 'test1'], 1 => [2, 'test2'], 2 => [3, 'test3'], ]; $ids = array_filter($data, function($item) { return $item[0]; })

我试图排除foreach循环,并用数组函数重构它们。我假设下面的代码会给出源数组中所有第一项的结果

<?php
    $data= [
        0 => [1, 'test1'],
        1 => [2, 'test2'],
        2 => [3, 'test3'],
    ];

    $ids = array_filter($data, function($item) {
        return $item[0];
    });

    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

数组_筛选器中包含的函数必须返回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);
用于根据数组中的元素是否满足某个标准过滤掉它们。因此,您创建了一个返回true或false的函数,并针对它测试数组的每个元素。您的函数将始终返回true,因为每个数组中都有第一个元素,所以数组不变

您要查找的是,它通过对数组中的每个元素运行回调来对其进行操作

<?php
$data= [
    0 => [1, 'test1'],
    1 => [2, 'test2'],
    2 => [3, 'test3'],
];

$ids = array_map(function($item) {
    return $item[0];
}, $data);

var_dump($ids);
尝试下面的代码

$data= [
        0 => [1, 'test1'],
        1 => [2, 'test2'],
        2 => [3, 'test3'],
    ];

    $ids = array_map(function($item) {
        return $item[0];
    }, $data);

    var_dump($ids);

filter函数需要为每个项返回一个布尔值(或任何可以强制为true的值),这样就可以保留它。因此,在您的例子中,它总是为数组中的每个元素返回true

要得到结果,你必须走一走

 $data = [
        0 => [1, 'test1'],
        1 => [2, 'test2'],
        2 => [3, 'test3'],
     ];


 array_walk($data, function($value, $key) use ($data){
                  $data[$key] = $value[0];
           })
试试这个代码

$data= [
        0 => [1, 'test1'],
        1 => [2, 'test2'],
        2 => [3, 'test3'],
    ];

    $ids = array_column($data, 0);
    var_dump($ids);

array_filter()回调返回一个true/false,指示该元素是否应包含在已过滤数组中;您总是返回一个真实值如果您只想获取ID(列
0
),那么应该使用:
$ids==array\u列($data,0)
array\u column
工作起来很有魅力!我相信这正是我在这种情况下所需要的。在发布之前检查其他答案!@iainn已经发布了这篇文章,感谢您澄清这一区别。不知怎的,
filter
听起来更符合逻辑+1它看起来比建议的
array\u列
array\u映射
更复杂。感谢您为展示
array\u walk
的可能性所作的贡献+1这是最好的答案,遗憾的是,这是来自已删除用户的纯代码答案。这正是
array\u column()
的用途。
$data= [
        0 => [1, 'test1'],
        1 => [2, 'test2'],
        2 => [3, 'test3'],
    ];

    $ids = array_column($data, 0);
    var_dump($ids);