【问题标题】:How to merge 2 associative arrays in PHP?如何在 PHP 中合并 2 个关联数组?
【发布时间】:2011-04-15 21:01:57
【问题描述】:

例子:

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4");
$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5");

输出:

$result = array('a' => array( 'f1' => "1", 'f2' => "9"),
              'b' => array( 'f1' => "2", 'f2' => "8"),
              'c' => array( 'f1' => "3", 'f2' => "7"),
              'd' => array( 'f1' => "0", 'f2' => "6"),
              'e' => array( 'f1' => "0", 'f2' => "5"),
              'z' => array( 'f1' => "4", 'f2' => "0"),);

$arr1 的大小可以是 $arr2 的 '>'、'

【问题讨论】:

  • 不存在的值是否用"0"填充?
  • 确实是这样。他需要两次传球。
  • 到目前为止你有什么 D3VELOPER?
  • D3VELOPER,webbiedave 得到了什么,很明显你没有自己尝试过,给我们一个你尝试过的例子将帮助我们“纠正”你哪里出错了。但是不向我们展示代码就像您要求我们这样做一样。正因为如此,我删除了我的解决方案,因为它可能与工作/家庭作业相关,而我只是为您提供答案并没有教给您任何东西。如果您确实有要显示的支持代码,请这样做。

标签: php merge associative-array


【解决方案1】:

我认为是这样,

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4");

$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5");


foreach($arr1 as $key => $value){
    $a[$key]['f1'] = $value;
}

foreach($arr2 as $key => $value){
    $b[$key]['f2'] = $value;
}

$c = array_merge_recursive($a, $b);
foreach($c as $key => $value){
    $result[$key]['f1'] = (array_key_exists('f1', $value)) ? $value['f1']: 0;
    $result[$key]['f2'] = (array_key_exists('f2', $value)) ? $value['f2']: 0;
}

echo "<pre>".print_r ($result, true);

输出:

Array
(
    [a] => Array
        (
            [f1] => 1
            [f2] => 9
        )

    [b] => Array
        (
            [f1] => 2
            [f2] => 8
        )

    [c] => Array
        (
            [f1] => 3
            [f2] => 7
        )

    [z] => Array
        (
            [f1] => 4
            [f2] => 0
        )

    [d] => Array
        (
            [f1] => 0
            [f2] => 6
        )

    [e] => Array
        (
            [f1] => 0
            [f2] => 5
        )

)

【讨论】:

    【解决方案2】:
    $arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4");
    
    $arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5");
    
    function combineArray($arr1, $arr2) {
        if (is_array($arr1) && is_array($arr2)) {
            $rArr = array();
            $steps = max ( count($arr1),count($arr2));
         $ak1 = array_keys($arr1);
         $ak2 = array_keys($arr2);
    
            for ($i=0;$i<$steps;$i++) {
                    if (!isset($rArr[$i])) $rArr[$i]=array();
                    $rArr[$i]['f1'] = (isset($arr1[$ak1[$i]])) ? $arr1[$ak1[$i]]: '0';
                    $rArr[$i]['f2'] = (isset($arr2[$ak2[$i]])) ? $arr2[$ak2[$i]]: '0';
            }
            return $rArr;
    
        }else {
            return false;
        }
    }
    
    echo "<pre>".print_r (combineArray($arr1, $arr2),true);
    

    可能会工作:)

    【讨论】:

    • 啊...忘记那个-.-:D
    【解决方案3】:

    试试这个:

    $keys = array_unique(array_merge(array_keys($arr1), array_keys($arr2)));
    $values = array_map(function($key) use ($arr1, $arr2) {
        return array('f1' => isset($arr1[$key]) ? $arr1[$key] : "0",
                     'f2' => isset($arr2[$key]) ? $arr2[$key] : "0"); }
        , $keys);
    $result = array_combine($keys, $values);
    var_dump($result);
    

    一些解释:

    • 首先获取两个数组的所有唯一键的数组$keys
    • 然后为每个键生成相应的值数组。
    • 最后组合键数组和值数组。

    但这目前仅适用于两个数组。


    编辑    这是一个适用于任意数量数组的方法:

    $arrays = array($arr1, $arr2);
    $keys = array_unique(call_user_func_array('array_merge', array_map('array_keys', $arrays)));
    $values = array_map(function($key) use ($arrays) {
        return array_combine(array_map(function($key) {
            return 'f'.($key+1);
        }, array_keys($arrays)),
        array_map(function($array) use ($key) {
            return isset($array[$key]) ? $array[$key] : "0";
        }, $arrays));
    }, $keys);
    $result = array_combine($keys, $values);
    var_dump($result);
    

    一些解释:

    • 将所有数组放入数组$arrays
    • 对于$arrays 中的每个数组,在其上调用array_keys 以获取键,合并这些数组并获取所有唯一键的数组$keys
    • 对于$keys中的每个键,检查该键是否存在于数组$arrays的数组中。
    • 组合键和值。

    【讨论】:

      【解决方案4】:

      array_merge_recursive() 应该可以工作:http://php.net/manual/en/function.array-merge-recursive.php

      否则它很简单,只需几行即可实现:(除非您真的需要“fn”索引。)

      function my_merge(){
      
          $result = array();
          foreach(func_get_args() as $a)
              foreach($a as $index => $value)
                  $result[$index][] = $value;         
      
      }
      

      【讨论】:

      • 放宽对数据格式的要求,代码可以简化几个数量级。除非它真的,真的必须完全符合您示例中的格式,否则这是一个合理的权衡。
      猜你喜欢
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2012-11-01
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多