【问题标题】:PHP, how to convert indexed array to associative array easilyPHP,如何轻松将索引数组转换为关联数组
【发布时间】:2017-07-27 19:29:59
【问题描述】:

最简单的转换方法是什么

$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"];
});

但我没有找到。

【问题讨论】:

  • 类似array_column()?
  • 有趣,听起来我可以在 array_column 上做 array_merge?
  • 可以在调用array_column()函数之前或之后合并

标签: php arrays


【解决方案1】:

您可以使用 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。
  • 我认为array_column 是 php 5.5 以上,而不是 php7
【解决方案2】:

我看到的唯一解决方案是遍历数组并手动创建一个新数组。

例如,像这样:

$new_array = [];
foreach ($array as $value) 
    $new_array[$value['name']] = $value;

【讨论】:

  • 谢谢,我可能受其他语言影响太大了。这个问题很常见,但我没有找到内置的解决方案。到目前为止,您的方法也是我能想到的最简单的方法。
  • 很高兴我能帮上忙。检查$value['name'] 是否存在也可能很好,否则代码在某些情况下可能会崩溃。
  • 好的,它们基本上是从一个数据库表加载的对象。
【解决方案3】:

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

这是我的实现:

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

看看这是否对任何人有帮助,哈哈

【讨论】:

    【解决方案4】:

    接受的答案很接近,但“接近”仅适用于手榴弹。

    ($unique 是一个索引数组)

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

    【讨论】:

      【解决方案5】:

      怎么样:

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

      【讨论】:

        【解决方案6】:

        你可以这样做

        $input = [
            ["id" => 1, "name" => "a1"],
            ["id" => 2, "name" => "a2"]
        ];
        
        $result = array_merge(
            ...array_map(
                fn($item) => [$item['name'] => $item],
                $input
            )
        );
        

        【讨论】:

        • 为您的代码添加一些解释将使此答案更有帮助。解释它如何改进近 5 年前给出的单行答案也是一个好主意。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多