PHP的array_column - 如何保留键名?

22

我在使用 array_column 函数时无法获取 $items 数组的键。

这是 $items 数组:

$items = array(
    1 => [
        "id" => 5
    ],
    3 => [
        "id" => 6
    ],
    4 => [
        "id" => 7
    ],
);
    
var_dump(array_column($items,"id"));

结果:

array (size=3)
  0 => int 5
  1 => int 6
  2 => int 7

我该如何获得下面想要的结果?

array (size=3)
  1 => int 5
  3 => int 6
  4 => int 7
10个回答

37

看看这是否有帮助

array_filter(array_combine(array_keys($items), array_column($items, 'id')));

2
即使某些项目没有“id”,这是否仍然有效? - John Franklin
1
不,这不是通用代码。尽管如此,它将适用于上述提出的问题。 - Ashish Choudhary
谢谢你的回答。但是为什么需要使用array_filter()才能使它工作呢? - Zevi Sternlicht
1
@ZeviSternlicht array_filter() 函数可以消除数组中的 空字符串nullfalse 值,从而使您获得一个干净的数组。如果您想保留 null 和空值,可以删除 array_filter() 函数。 - Ashish Choudhary
谢谢,虽然array_column可以有一个开关参数来实现你发布的这种行为。 - FantomX1
@JohnFranklin 不行,如果某些项没有“id”,这是行不通的。请参见https://3v4l.org/im2gZ。你会得到“致命错误:未捕获的ValueError:array_combine():参数#1($keys)和参数#2($values)必须具有相同数量的元素”。 - donquixote

11

我认为这是在不使用循环和迭代的情况下保留键的最快方法。

array_diff(array_combine(array_keys($items), array_column($items, 'id')), [null])

好的回答,这让工作变得容易了。 - Adrian Cid Almaguer
2
很好的答案,但请解释一下您的答案。这有助于其他人理解您为什么使用了这样的方法。 - Pankaj Jha

5

我正在寻找相同的解决方案并结合一些技巧,我创建了这个:

$userdb=Array
(
    "test1" => array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'url' => 'urlof100'
    ),
    "test2" => array
    (
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),
    "test3" => array
    (
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);

echo $key = array_search(
    40489,
    array_filter(
        array_combine(
            array_keys($userdb),
            array_column(
                $userdb, 'uid'
            )
        )
    )
);

结果是'test3'。

使用数组数字或命名数组。


5
最简单且性能最好的方法可能是使用
array_combine(array_keys($data), array_column($data, 0));

1
我注意到array_column如果列不存在,它不会返回任何值。因此,在返回的数组键比数组列多时,这可能会引起麻烦,所以只有在您知道它对所有索引始终存在时才使用它。 - Corby Jurgens

4

另一种选择是使用array_map

$result = array_map(function($item) {return $item['id'];}, $items);


1
这是一个针对示例的解决方案,但并非问题的有效解决方案。如果您有一个包含“子数组”的数组,该子数组不包含具有键id的键值对,则此对仍将出现在结果中,因为使用array_column时不会出现这种情况。 - Flummiboy
这个答案对于问题中提供的示例数据提供了简洁的解决方案,没有任何问题。 - mickmackusa

3

我写了一个简单的函数array_column_keys,它的参数和array_column相同。

/**
 * Return the values from a single column in the input array by keeping the key
 *
 * @param array $array     A multi-dimensional array (record set) from which to pull a column of values.
 * @param mixed $column    The column of values to return. This value may be the integer key of the column you wish to retrieve, or it may be the string key name for an associative array. It may also be NULL to return complete arrays (useful together with index_key to reindex the array).
 * @param mixed $index_key [optional] The column to use as the index/keys for the returned array. This value may be the integer key of the column, or it may be the string key name.
 *
 * @return array Returns an array of values representing a single column from the input array.
 */
function array_column_keys($array, $column, $index_key = null)
{
    $output = [];

    foreach ($array as $key => $item) {
        $output[@$item[$index_key] ?? $key] = @$item[$column];
    }

    return array_filter($output, function($item) {
        return null !== $item;
    });
}

第三个参数index_key就是我需要的。 以下示例中,将第三个参数设置为null将会回答这个问题:
$result = array_column_keys($items, 'id');

...并且还让您定义键的值

$result = array_column_keys($items, 'id', 'any_key');

这将导致...
array (size=3)
 string 'any_value1' => int 5
 string 'any_value2' => int 6
 string 'any_value3' => int 7

2

使用array_combine(array_keys($data), array_column($data, 'id'));

'id' => 列名,用于显示


虽然您的回答可能解决了问题,但是包括解释如何以及为什么解决问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。您可以编辑您的答案以添加解释,并指出适用的限制和假设。- 来自审核 - Adam Marshall

1

这里是一个更“现代风格”的解决方案,使用内联箭头函数(PHP7.4+):

array_map(fn($e) => $e['id'], $items);

PHP官方文档摘录:

array_map()函数仅在传递一个数组时保留数组参数的键。


0

针对只有一列id的示例

array_map('current', $items);

1
这是一个针对示例的解决方案,但并非问题的有效解决方案。如果您有一个包含“子数组”的数组,该子数组不包含具有键id的键值对,则此对仍将出现在结果中,因为使用array_column时不会出现这种情况。 - Flummiboy
这个答案对于问题中提供的示例数据提供了简洁的解决方案,没有任何问题。 - mickmackusa

-3
foreach(key($parameters) as $key)
{
print($key);
}

如果需要,您还可以将该结果存储在其他变量中。

要同时显示键和值,请尝试以下操作:

foreach ($parameters as $key => $value) {
echo $key . ' = ' . $value . '<br>';
}

3
这怎么回答有关使用array_column的问题呢? - Jake

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