根据列值将多维索引数组转换为关联数组

时间:2016-10-25 12:04:58

标签: php arrays multidimensional-array

我有一个多维索引数组。每个元素都是一个带有id列的关联数组,它在元素之间是唯一的(它的值永远不会在数组中重复)。

[indexed] =>Array
(
    [0] => Array
        (
            [id] => john
            [name] => John
            [age] => 29
        ),

    [1] => Array
        (
            [id] => peter
            [name] => Peter
            [age] => 30
        ),

    [2] => Array
        (
            [id] => harry
            [name] => Harry
            [age] => 19
        )
)

我的目标是将此数组转换为多维关联数组,并按id值编制索引。

[indexed] =>Array
(
    [john] => Array
        (
            [id] => john
            [name] => John
            [age] => 29
        ),

    [peter] => Array
        (
            [id] => peter
            [name] => Peter
            [age] => 30
        ),

    [harry] => Array
        (
            [id] => harry
            [name] => Harry
            [age] => 19
        )
)

到目前为止,我最好的尝试是遍历数组元素并手动创建最终数组。

$associative = array();
foreach($indexed as $key=>$val) $associative[$val['id']] = $val;

我认为这不是最优雅的解决方案。是否可以通过内置(更高效)的功能获得相同的结果?

2 个答案:

答案 0 :(得分:2)

事实是 php确实提供了一个单一的本机函数,可让您用单个列的值替换外部索引。 “魔术”位于第二个参数中,该参数告诉php在分配新键时不要触摸子数组值。

代码:(Demo

$indexed = [
    ['id' => 'john', 'name' => 'John', 'age' => 29],
    ['id' => 'peter', 'name' => 'Peter', 'age' => 30],
    ['id' => 'harry', 'name' => 'Harry', 'age' => 19],
];

var_export(array_column($indexed, null, 'id'));

输出:

array (
  'john' => 
  array (
    'id' => 'john',
    'name' => 'John',
    'age' => 29,
  ),
  'peter' => 
  array (
    'id' => 'peter',
    'name' => 'Peter',
    'age' => 30,
  ),
  'harry' => 
  array (
    'id' => 'harry',
    'name' => 'Harry',
    'age' => 19,
  ),
)

答案 1 :(得分:1)

这是另一种方法(假设$arr是你的原始数组):

$associative = array_combine(array_map(function($item) { return $item['id']; }, $arr), $arr);

但我认为使用foreach仍然比这更短,更易读。