【问题标题】:Combining two arrays by ID in PHP在PHP中按ID组合两个数组
【发布时间】:2012-07-24 15:12:50
【问题描述】:

我需要在 PHP 中比较两个二维数组。数组如下所示:

Array one
ID Name
11 Aa 
11 Ab
12 Bb
13 Cc
14 Dd
15 Ee

Array two
ID Content
11 Cat
13 Dog
14 Donkey

现在我需要将这两个组合成一个数组,如下所示:

ID Name Conent
11 Aa Cat
11 Ab Cat
12 Bb
13 Cc Dog
14 Dd Donkey
15 Ee

我怎样才能做到这一点?我对 array_merge() 或 $array3 = $array1 + $array2; 没有运气;

【问题讨论】:

  • 您是否只是想将具有相同 ID 的两个字符串连接成一个字符串,或者您是否想在本质上拥有一个具有多个值的键?
  • array_merge/addition 不会改变数组的维度。如果你输入两个 1x10 数组,你最终会得到 1x20,而不是 2x10 或 4x5 之类的。
  • 我终于通过更改 SQL 查询解决了这个问题。似乎 php 不太适合处理复杂的数组。 :-(

标签: php arrays multidimensional-array


【解决方案1】:

一种快速的方法是遍历第一个数组并附加第二个数组的值:

$array1 = array('11' => 'Aa', '12' => 'Bb', '13' => 'Cc', '14' => 'Dd', '15' => 'Ee');
$array2 = array('11' => 'Cat', '13' => 'Dog', '14' => 'Donkey');

$combined = array();
foreach ($array1 as $key => $val) {
    $combined[$key] = $val . (isset($array2[$key]) ? ' '.$array2[$key] : '');
}

这将遍历$array1 中的每个键/值并将其添加到$combined 数组中。如果$array2 中的某个值具有相同的索引,它会将其附加到$array1 中的该值,并用空格分隔。

更新:我(再次)误读了数组的格式。我假设ID 是数组中的实际索引,但由于示例数组输出同时具有NameContent,我假设ID 是实际索引字符串值而不是数组本身中的索引.要坚持循环场景,您可以遍历第一个数组并让嵌套循环遍历第二个数组:

$array1 = array(
        array('ID' => '11', 'Name' => 'Aa'),
        array('ID' => '12', 'Name' => 'Bb'),
        array('ID' => '13', 'Name' => 'Cc'),
        array('ID' => '14', 'Name' => 'Dd'),
        array('ID' => '15', 'Name' => 'Ee'),
    );
$array2 = array(
        array('ID' => '11', 'Content' => 'Cat'),
        array('ID' => '13', 'Content' => 'Dog'),
        array('ID' => '14', 'Content' => 'Donkey')
    );

$combined = array();
foreach ($array1 as $arr) {
        $comb = array('ID' => $arr['ID'], 'Name' => $arr['Name'], 'Content' => '');
        foreach ($array2 as $arr2) {
            if ($arr2['ID'] == $arr['ID']) {
                $comb['Content'] = $arr2['Content'];
                break;
            }
        }
    $combined[] = $comb;
}

这会将$array1 中的每个值添加到组合数组中,并且当且仅当$array2 中的值包含相同的ID 字段时,它也会将其Content 字段添加到数组中。这也可以扩展为处理任意数量的字段,无论是通过名称,还是通过将内部 if 块更改为 $comb += $arr2; 来代替(这应该合并所有不存在的索引)。

【讨论】:

    【解决方案2】:

    你必须自己制作函数:

    function putThemTogether($array1, $array2) {
        $output = array();
        foreach($array1 as $key => $value) {
            if (!isset($output[$key]))
                $output[$key] = array();
            $output[$key][] = $value;
        }
        foreach($array2 as $key => $value) {
            if (!isset($output[$key]))
                $output[$key] = array();
            $output[$key][] = $value;
        }
        return $output;
    }
    

    为了使它更好,你可以让它接受任意数量的参数。

    【讨论】:

      【解决方案3】:
      $result = array_map (
        function ($item) { return is_array($item) ? implode(' ', $item) : $item; },
        array_merge_recursive($array1, $array2);
      );
      

      注意,两个数组都需要字符串键

      【讨论】:

        【解决方案4】:

        另一种解决方案是使用array_searcharray_column(从PHP 5.5.0 开始)。

        foreach ($array1 as $key => $val) {
            $found_key = array_search($val['ID'], array_column($array2, 'ID'));
            if ($found_key !== false) { $array1[$key]['Content'] = $array2[$found_key]['Content']; }
        }
        

        【讨论】:

          【解决方案5】:

          试试这个我希望它会工作

          function merge_two_arrays($array1,$array2) {
              $data = array();
              $arrayAB = array_merge($array1,$array2);
              foreach ($arrayAB as $value) {
                  // This assumes there is a field called "id"
                  $id = $value['id'];
                  if (!isset($data[$id])) {
                      $data[$id] = array();
                  }
                  $data[$id] = array_merge($data[$id],$value);
              }
              return $data;
          }
          
          $master_array = merge_two_arrays($array1,$array2);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-08
            • 1970-01-01
            • 2011-02-22
            • 1970-01-01
            • 1970-01-01
            • 2019-04-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多