基于列值的多维索引数组转换为关联数组

4
我有一个多维索引数组。每个元素都是一个关联数组,并且具有一个唯一的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;

我认为这不是最优雅的解决方案。是否有可能使用内置(更有效)的函数获得相同的结果?


我认为在PHP中没有内置函数可以通过特定值覆盖数组中的键。如果数组计数不是很大,那么这个解决方案是可以的。否则,请使用XML或JSON进行快速处理。 - Mangesh Sathe
@MangeshSathe 那个说法是不正确的。请看我的回答。 - mickmackusa
2个回答

9
事实上,PHP确实提供了一个原生函数,可以让你用单个列的值替换外部索引。其中的“魔力”在于第二个参数,它告诉PHP在分配新键时不要触及子数组值。
代码: (演示)
$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,
  ),
)

这甚至可以用在对象数组上。最终的结果是一个带有新的关联一级键的对象数组。(演示

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

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

输出:

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

1

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

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

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


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