PHP array_filter只从数组中获取一个值

时间:2016-05-18 12:19:00

标签: php arrays

我正在尝试排除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

5 个答案:

答案 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"
  }
}