【问题标题】:Merge array by index/key keeping all values按索引/键合并数组,保留所有值
【发布时间】:2014-05-19 07:16:13
【问题描述】:

我有 n 数组数量

$array1=array('usa'=>123, 'uk' => '1234', 'germany'=> '1235');
$array2=array('usa'=>123a, 'uk' => '1234', 'germany'=> '1235aa');
$array3=array('usa'=>123, 'uk' => '1234a', 'germany'=> '123a5');

$arrayn=array('usa'=>123b, 'uk' => '1234', 'germany'=> '1235');

我需要一个 php 代码,以便我可以得到如下结果:

$final_array=array(
                 'usa'=>'123,123a,123,...,123b',
                 'uk'=>'1234,1234,1234a,...,1234', 
                 'germany'=>'1235,1235aa, 123a5,...,1235'
             );

谁能帮我怎么做?

【问题讨论】:

  • $array1 到 $arrayn 不在数组上?它们是个体变量吗?
  • 是的,它们都是单独的变量...
  • 他们是固定数字还是会有所不同?
  • @user1140176 :从this 教程中获得一些想法。
  • @UglyEddie :可能是staticdynamic。这里没有必要。他需要一些逻辑来合并它们。很简单。

标签: php arrays


【解决方案1】:

所以使用call_user_func_array() 来执行此操作:

$array1=array('usa'=>'123', 'uk' => '1234', 'germany'=> '1235');
$array2=array('usa'=>'123a', 'uk' => '1234', 'germany'=> '1235aa');
$array3=array('usa'=>'123', 'uk' => '1234a', 'germany'=> '123a5');

$result = array_map(function($x)
{
   return join(',', $x);
}, call_user_func_array('array_merge_recursive', [$array1, $array2, $array3]));

即:array_merge_recursive() 将收集所有具有相应键的项目。稍后array_map() 将使用join() 将项目转换为分隔符分隔的字符串。

请注意,由于您的所有数组都是单独的变量,因此您必须在 call_user_func_array() 的参数数组中重新计算所有这些变量

【讨论】:

  • 如果我必须传递 n 个数组怎么办。我的意思是如果我不知道有多少个数组怎么办??
  • 然后创建数组,其中将包含您的数组。因为如果您有一组变量并且您不知道它们是什么(它们的名称是什么,它们的计数是多少等)-那么您如何获得结果?你的输入条件应该被定义,你不能用“未知变量”来做
【解决方案2】:

您可以创建一个函数,在其中您可以一个一个地传递您的数组。

<?php
$array1=array('usa'=>'123', 'uk' => '1234', 'germany'=> '1235');
$array2=array('usa'=>'123a', 'uk' => '1234', 'germany'=> '1235aa');
$array3=array('usa'=>'123', 'uk' => '1234a', 'germany'=> '123a5');

function add_arr($arr, &$final)
{
    foreach($arr as $key=>$val){
        if(isset($final[$key])){
            $final[$key].=",".$val;
        }else{
           $final[$key]=$val;
        }
    }
}

$arr_final=array();
add_arr($array1,$arr_final);
add_arr($array2,$arr_final);
add_arr($array3,$arr_final);

print_r($arr_final);
?>

这里是DEMO

【讨论】:

    【解决方案3】:
    function array_merge_multiple() {
        $result = array();
        $numargs = func_num_args();
        $arg_list = func_get_args();
        for ($i = 0; $i < $numargs; $i++) {
            $array = $arg_list[$i];
            $keys = array_keys($array);
            foreach ($keys as $v) {
                if (isset($result[$v])) {
                    $result[$v].="," . $array[$v];
                } else {
                    $result[$v] = $array[$v];
                }
            }
        }
        return $result;
    }
    $result=array_merge_multiple($array1,$array2,$array3,$arrayn);
    

    //$result=array_merge_multiple($array1,$array2,$array3,.........,$arrayn);

    print_r($result);
    

    【讨论】:

    • 这将产生您预期的结果,您可以传递“N”个数组。
    【解决方案4】:

    可能是这样的

    function black_magic($arrays = array()) {
    $return = array();
    foreach ($arrays as $array) {
        if (!$return) {
        $return = $array;
        continue;
        }
    
        foreach ($array as $key => $value) {
        if (isset($return[$key])) {
            $return[$key] .= ($return[$key]) ? ",$value" : $value;
        }
        else {
            $return[$key] = $value;
        }
    
        unset($key, $value);
        }
    
        unset($array);
    }
    
    return $return;
    }
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

      $array1=array('usa'=>123, 'uk' => '1234', 'germany'=> '1235');
      
      $array3=array('usa'=>1231, 'uk' => '1234a', 'germany'=> '123a5');
      
      $result = array_merge_recursive($array1, $array3);
      

      $result 是合并后的结果

      【讨论】:

        猜你喜欢
        • 2013-06-29
        • 2021-09-14
        • 2012-11-14
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-08
        • 1970-01-01
        • 2015-12-27
        相关资源
        最近更新 更多