PHP数组过滤器:从数组中获取一个值

9

我试图排除使用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

1
array_filter() 回调函数返回一个 true/false 值,指示元素是否应包含在过滤后的数组中;您始终返回一个 truthy 值。 - Mark Baker
2
如果你只想获取id(第0列),那么你应该使用array_column()函数:$ids == array_column($data, 0); - Mark Baker
array_column 的效果非常好!我相信它正是我在这种情况下所需要的。 - Ben Fransen
array_filter() 没有按预期工作,Manipulate array filter in php value array not change,为什么 array_filter() 在迭代时不会改变我的字符串?在 array_filter() 和 strlen 函数中存在问题。 - mickmackusa
5个回答

17

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);

正如另一个答案所提到的,如果你只想提取单个“列”,那么array_column是一个更简单的选择。


1
感谢您澄清了这个区别。不知何故,filter 对我来说听起来更合乎逻辑。+1A - Ben Fransen

10
尝试使用这段代码。
$data= [
        0 => [1, 'test1'],
        1 => [2, 'test2'],
        2 => [3, 'test3'],
    ];

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

3
这是最佳答案,遗憾的是它来自一个已删除用户的仅包含代码的回答。这正是 array_column() 的用途。 - mickmackusa

2
过滤函数需要针对每个项目返回一个布尔值(或任何可以强制转换为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];
           })

那看起来比建议使用的 array_columnarray_map 要复杂。感谢您为展示 array_walk 的可能性做出的贡献。+1 - Ben Fransen

0

在 array_filter 中包含的函数必须返回 true 或 false。0 或空数组会被转换为 FALSE。非零数字被视为 true。

所以如果你想找到 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"
  }
}

0

尝试下面的代码

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

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

    var_dump($ids);

3
在发布答案之前,请先检查其他的回答!已经有 @iainn 发布了该回答。 - Thamilhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接