PHP,如何轻松地将索引数组转换为关联数组

12

最简单的转换方式是什么

$a = array(
    array("id" => 1, "name" => "a1"),
    array("id" => 2, "name" => "a2")
);

$b = array(
    "a1" => array("id" => 1, "name" => "a1"),
    "a2" => array("id" => 2, "name" => "a2")
);

我原本期待PHP有一些函数式编程的功能,可以做一些类似这样的事情:

$b = map($a, function($item) {
    return $item["name"];
});

但我没有找到一个。


2
类似 array_column() 的东西? - frz3993
有趣,听起来我可以在array_column上执行array_merge? - user1633272
你可以在调用 array_column() 函数之前或之后进行合并。 - frz3993
6个回答

23
您可以使用 PHP 的 array_column() 函数。对于您的使用情况,第二个参数应该是null,以返回完整的数组。
$a = array(
array("id" => 1, "name" => "a1"),
array("id" => 2, "name" => "a2")
);

$b = array_column($a, null, 'name');

并且 print_r($b) 的结果是

Array
(
[a1] => Array
    (
        [id] => 1
        [name] => a1
    )

[a2] => Array
    (
        [id] => 2
        [name] => a2
    )

)

点赞,更直接的解决方案,但仅适用于PHP7。 - Casimir et Hippolyte
2
我认为array_column函数需要PHP 5.5以上的版本,而不是PHP7。 - Ng Sek Long

8
我认为唯一的解决方案是遍历该数组并手动创建一个新的数组。
例如,像这样:
$new_array = [];
foreach ($array as $value) 
    $new_array[$value['name']] = $value;

谢谢,我可能受到其他语言的影响太多了。这个问题非常普遍,但我没有找到内置的解决方案。你的方法是迄今为止我能想到的最简单的方法。 - user1633272
很高兴能够帮助。最好还要检查一下 $value['name'] 是否存在,否则代码在某些情况下可能会崩溃。 - Jerodev
好的,它们基本上是从数据库的一个表中加载的对象。 - user1633272

1
你可以简单地这样做。
$input = [
    ["id" => 1, "name" => "a1"],
    ["id" => 2, "name" => "a2"]
];

$result = array_merge(
    ...array_map(
        fn($item) => [$item['name'] => $item],
        $input
    )
);

2
为您的代码添加一些解释会使这个答案更有帮助。解释它如何改进近5年前给出的单行答案也是一个好主意。 - miken32

1

接受的答案很接近,但“接近”只对手榴弹有效。

($unique 是一个索引数组)

$sub_key = 'country';
$new_array = [];
foreach ($unique as $value) {
  $new_array[] = [$sub_key => $value];
}

0

这样怎么样:

$a = array(
    array('a' => 'a0', 'b' => 'b0', 'c' => 'c0'),
    array('a' => 'a1', 'b' => 'b1', 'c' => 'c1'),
    array('a' => 'a2', 'b' => 'b2', 'c' => 'c2'),
    );
print_r($a);
print_r(array_combine(array_column($a, 'a'), $a));

其中'a'是用作关联索引的列。

这将留下成为数组索引的列。

array_column(PHP 5> = 5.5.0,PHP 7)

array_combine(PHP 5,PHP 7)


0

可怜的我需要在PHP 5.2中实现这个,但我不想使用 for 循环

这是我的实现:

        function getField($x) { return $x['name']; }
        $ids = array_map('getField', $result);
        $result = array_combine($ids, $result);

看看这个能不能帮到任何人哈哈


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