【问题标题】:PHP multiple arrays to one associative arrayPHP多个数组到一个关联数组
【发布时间】:2012-12-20 04:53:35
【问题描述】:

如何合并这三个数组

$name ={"Tom", "John", "David"};
$v1 = {"Tom":100, "David":200};
$v2 = {"John":500, "Tom":400};

以两种不同的方式进入一个多维关联数组? 一种方法是键顺序应与数组“名称”的键顺序相同。

$name_merged_original_order = array (
    "Tom" => Array(
        "v1" => 100,
        "v2" => 400
    ),
    "John" => Array(
        "v1" => "N/A",
        "v2" => 500
    ),
    "David" => Array(
        "v1" => 100,
        "v2" => "N/A"
    )
)

另一种方法是数组“名称”的字母顺序:

$name_merged_asc = array (
    "David" => Array(
        "v1" => 100,
        "v2" => "N/A"
    ),
    "John" => Array(
        "v1" => "N/A",
        "v2" => 200
    ),
    "Tom" => Array(
        "v1" => 100,
        "v2" => 400
    ),
)

棘手的部分是数组“v1”和“v2”没有作为“name”的键排序。他们也没有“名称”中的所有键。谢谢!

【问题讨论】:

    标签: php arrays merge multidimensional-array associative


    【解决方案1】:

    未经测试,最简单的解决方案:

    $name_merged_original_order = array();
    foreach($name as $key){
        $name_merged_original_order[$key] = array();
        if(array_key_exists($key, $v1)){
            $name_merged_original_order[$key]['v1'] = $v1[$key];
        }
        else{
            $name_merged_original_order[$key]['v1'] = 'N/A';
        }
        if(array_key_exists($key, $v2)){
            $name_merged_original_order[$key]['v2'] = $v2[$key];
        }
        else{
            $name_merged_original_order[$key]['v2'] = 'N/A';
        }
    }
    
    sort($name);
    $name_merged_asc = array();
    foreach($name as $key){
        $name_merged_asc[$key] = array();
        if(array_key_exists($key, $v1)){
            $name_merged_asc[$key]['v1'] = $v1[$key];
        }
        else{
            $name_merged_asc[$key]['v1'] = 'N/A';
        }
        if(array_key_exists($key, $v2)){
            $name_merged_asc[$key]['v2'] = $v2[$key];
        }
        else{
            $name_merged_asc[$key]['v2'] = 'N/A';
        }
    }
    

    【讨论】:

    • 不客气。现在是德国早上 6 点,我在关联数组上猛烈抨击 :)
    【解决方案2】:

    据我了解,您想要这样的东西:

    $name = array("Tom", "John", "David");
    $result = array();
    $v1 = array("Tom" => "200", "John" => "100", "David" => "10");
    $v2 = array("Tom" => "254", "David" => "156");
    $vars = array("v1", "v2");
    foreach($name as $n)
    {
      $result[$n] = array();
      foreach($vars as $v)
      {
        if(array_key_exists($n, ${$v}))
          $result[$n][$v] = ${$v}[$n];
      }
    }
    

    我希望$result是你所需要的。

    【讨论】:

    • 非常感谢,这真的很简单,但如果密钥不存在,我仍然需要“N/A”值。但仍然是伟大而简单的解决方案!
    • 不客气!尝试添加 else-statement else $result[$n][$v] = "N/A";
    【解决方案3】:

    例如,您有以下数组:

    <?php
    $FirstArrays = array('a', 'b', 'c', 'd');
    $SecArrays = array('1', '2', '3', '4');
    

    1)

    foreach($FirstArrays as $index => $value) {
        echo $FirstArrays[$index].$SecArrays[$index];
        echo "<br/>";
    }
    

    或 2)

    for ($index = 0 ; $index < count($FirstArrays); $index ++) {
      echo $FirstArrays[$index] . $SecArrays[$index];
      echo "<br/>";
    }
    

    【讨论】:

      【解决方案4】:

      从您的 cmets 中假设您只想要在所有 3 个数组中匹配的项目:

      for( $i=0; $i< count($name) ; $i++){
          if( !empty( $v1[ $name[$i]]) &&  !empty( $v2[ $name[$i]]) ){
             $newArray[$name[$i]]= array( 'v1'=> $v1[ $name[$i]], 'v2'=> $v2[ $name[$i]]):
          }
      }
      

      排序:

        asort($newArray);
      

      【讨论】:

      • 谢谢,但我只是让示例变得足够简单。我想学习通用方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2016-10-19
      相关资源
      最近更新 更多