【问题标题】:PHP merge arrays by value for 2 different array valuePHP按值合并数组以获取2个不同的数组值
【发布时间】:2015-09-19 14:08:33
【问题描述】:

我试图将两个不同的数组合并到一个数组中。谁能帮帮我?

我有这样的数组

[0] (Array)#2
  [rank] "579"
  [id] "1"
[1] (Array)#4
  [rank] "251"
  [id] "2"

[0] (Array)#2
  [size] "S"
  [rank] "251"
[1] (Array)#15
  [size] "L"
  [rank] "579"

我需要这样的

[0] (Array)#2
  [size] "S"
  [rank] "251"
  [id] "1"
[1] (Array)#15
  [size] "L"
  [rank] "579"
  [id] "1"

【问题讨论】:

  • 所需的输出对我来说没有多大意义。
  • 你有没有尝试过?你是怎么得到这些数组的?
  • 我敢打赌你对这些数组做错了。
  • 同意@RoboRobok,如果您更广泛地解释问题,可能会有更好的方法来阻止您首先到达这一点:)

标签: php arrays merge


【解决方案1】:

未经测试,但这应该可以工作,或者至少让你接近。

for ($array1 as $key1 => $value1) {
    for ($array2 as $key2 => $value2) {
        if ($value1['rank'] == $value2['rank']) {
            $result[$key1] = [$value2['size'], $value1['rank'], $value1['id']];
        };
    };
};

【讨论】:

  • 这将更改其中一个数组 ($array1)。您必须确保根据您的标准接受它。通常,合并过程应该保留两个原始根并创建一个新的 (third) 实体作为结果
  • 已修复,我们/我可以让它找出它需要复制的密钥。到目前为止,还没有看到任何添加它的理由。
【解决方案2】:
foreach($arr1 as $key1 => $data1){
    foreach($arr2 as $key2 => $data2){
        if($data1['rank']==$data2['rank']){
            $result[] = array_merge($data1, $data2);
        }
    }
}
print_r($result);

【讨论】:

  • 一个适当的合并解决方案,但您假设 rank 键在两个数组中始终存在且唯一(就这种情况而言,这很好:))
  • 如果你有任何唯一的关键人,你使用了那个,否则你不需要检查条件和 seconf 循环。 :)
  • 同意,就我们对 rank 的假设而言是有效的 ;)
【解决方案3】:
//save keys of ranks in the 1st array
$keys = array(); 
foreach($arr1 as $k => $v)
   $keys[$v['rank']] = $k;

$res = array();
// Walk through the 2nd array and make result
foreach($arr2 as $k => $v) 
 if (isset($keys[$v['rank']])) 
    $res[] = array_merge($arr1[$keys[$v['rank']]], $v);

print_r($res);

【讨论】:

    【解决方案4】:

    查看您提供的数组,我假设您想使用键 rank 作为连接点 (这似乎不是一个好主意,问题是如果它们是否独一无二) 如果它们是独一无二的,那么一个微小的方法可以帮助根据它们的等级获取元素,其余的只是组装结果:

    <?php
    
    $arr1 = [
        [
            'rank' => 579,
            'id' => 1
        ],
        [
            'rank' => 251,
            'id' => 2
        ],
    ];
    
    $arr2 = [
        [
            'size' => 'S',
            'rank' => 251
        ],
        [
            'size' => 'L',
            'rank' => 579
        ],
    ];
    
    function getItemByRank($array, $rank)
    {
        foreach ($array as $item){
            if ($item['rank'] === $rank) {
                return $item;
            }
        }
    }
    
    
    $result = [];
    foreach ($arr1 as $k => $item) {
    
        $match = getItemByRank($arr2, $item['rank']);
    
        if (isset($match)) {
            $result[$k] = $item;
            $result[$k]['size'] = $match['size'];
        }
    }
    
    print_r($result);
    

    输出:

    Array
    (
        [0] => Array
            (
                [rank] => 579
                [id] => 1
                [size] => L
            )
    
        [1] => Array
            (
                [rank] => 251
                [id] => 2
                [size] => S
            )
    
    )
    

    【讨论】:

      【解决方案5】:

      虽然我不明白为什么要以这种方式合并数组,但这里有一种按数组顺序合并数组的方法。所以array1的第一个孩子将与array2的第一个孩子等合并。

      <?php
      
      $array1 = [
          [
              'rank' => 579,
              'id' => 1
          ],
          [
              'rank' => 251,
              'id' => 2
          ]
      ];
      
      $array2 = [
          [
              'size' => 'S',
              'rank' => 251
          ],
          [
              'size' => 'L',
              'rank' => 579
          ]
      ];
      
      
      foreach ($array1 as $key => &$data) {
          if (isset($array2[$key])) {
              $data = array_merge($data, $array2[$key]);    
          }
      }
      
      var_dump($array1);
      

      【讨论】:

      • 如果序列不相同怎么办?
      • 如果大多数答案都假设是这种情况并且@user3686600 想要使用排名作为连接点,那么这个解决方案将是不正确的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多