【问题标题】:Multidimensional indexed array to associative array depending on column value多维索引数组到关联数组取决于列值
【发布时间】:2023-04-09 14:43:01
【问题描述】:

我有一个多维索引数组。每个元素都是一个关联数组,其中有一个 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 中没有内置函数可以用数组中的特定值覆盖 Key。如果数组数量不是很大,那么这个解决方案就可以了。否则使用处理速度快的 XML 或 JSON
  • @MangeshSathe 声明不正确。看我的回答。

标签: php arrays multidimensional-array


【解决方案1】:

事实上,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,
  ),
)

这甚至适用于对象数组。最终结果是具有新的关联一级键的对象数组。 (Demo)

$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,
  ),
)

【讨论】:

    【解决方案2】:

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

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

    但我认为与此相比,使用 foreach 仍然更短且更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      相关资源
      最近更新 更多