【问题标题】:Convert array of key-value pairs into associative array without using column names将键值对数组转换为关联数组而不使用列名
【发布时间】:2016-11-09 21:54:47
【问题描述】:

我有一个来自数据库查询的数组:

Array (
  [0] => Array ( [div_id] => 21 [div_name] => "Alphabet" )
  [1] => Array ( [div_id] => 16 [div_name] => "Elementary" )
  [2] => Array ( [div_id] => 19 [div_name] => "Preschool" )
  [3] => Array ( [div_id] => 20 [div_name] => "Secondary" )
)

我想把它变成:

Array ( 
  [21] => "Alphabet"
  [16] => "Elementary"
  [19] => "Preschool"
  [20] => "Secondary"
)

但是,我不能使用键名。我需要将它们作为第一列和第二列引用,因为在我的上下文中我无法控制源数据的键。我需要对具有不同键名的数据使用相同的算法,例如:

Array (
  [0] => Array ( [unknown_id] => 21 [random] => "Alphabet" )
  [1] => Array ( [unknown_id] => 16 [random] => "Elementary" )
  [2] => Array ( [unknown_id] => 19 [random] => "Preschool" )
  [3] => Array ( [unknown_id] => 20 [random] => "Secondary" )
)

问题与Convert array of key-value pairs into associative array 非常相似,但键有 [0] 和 [1],我有文本键但仍需要引用数组的第一项和第二项。

【问题讨论】:

  • 最坏结果,只需遍历数组并手动完成。

标签: php arrays


【解决方案1】:

你可以这样做:

$indexed = array_map('array_values', $data);
$res = array_combine(array_column($indexed, 0), array_column($indexed, 1));

或者使用array_column的第三个参数:

$res = array_column(array_map('array_values', $data), 1, 0);

【讨论】:

    【解决方案2】:

    实际上有一个内置函数可以做到这一点。使用第三个参数按特定列索引数组:

    $result = array_column($array, 'div_name', 'div_id');
    

    array_column() 需要 PHP >= 5.5.0 或使用 PHP Implementation of array_column()

    【讨论】:

    • 请记住我不能使用键名。此解决方案不起作用。
    【解决方案3】:

    因为对不可预知的键使用函数式编程会导致不必要的卷积和过度迭代。您应该使用经典的foreach() 循环来设置您的新数据结构。

    代码:(Demo)

    $array = [
      ["unknown_id1" => 21, "randomA" => "Alphabet"],
      ["unknown_id2" => 16, "randBom" => "Elementary"],
      ["unknown_id3" => 19, "raCndom" => "Preschool"],
      ["unknown_id4" => 20, "Drandom" => "Secondary"]
    ];
    
    foreach ($array as $row) {
        $result[current($row)] = end($row);
    }
    var_export($result);
    

    输出:

    array (
      21 => 'Alphabet',
      16 => 'Elementary',
      19 => 'Preschool',
      20 => 'Secondary',
    )
    

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2016-07-21
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多