PHP:合并多维关联数组(LEFT JOIN模拟——保留重复项,保留不存在的元素)

PHP: merge multidimensional, associative arrays (LEFT JOIN simulation - keep duplicates, keep non-existent elements)

我有两个关联的多维数组 $arrayOffered$arraySold。我想在某些条件下合并它们:

$arrayOffered 中的一个元素在 $arraySold 中可以有 >1 个等价物。它们应该按如下所示的方式连接。

输入数据:

$arrayOffered = array(
          0 => array('item' => 'product_1', 'Category' => 'ABC'), 
          1 => array('item' => 'product_2', 'Category' => 'DEF')
          );  

$arraySold = array(
          0 => array('item' => 'product_1', 'ItemsSold' => '2', 'ItemsReturned' => 1), //arrays in this array can contain up to 30 elements
          1 => array('item' => 'product_1', 'ItemsSold' => '1')
          );    

想要的结果:

$desiredResult = array( 
        0 => array('item' => 'product_1', 'Category' => 'ABC', 'ItemsSold' => '2', 'ItemsReturned' => 1),
        1 => array('item' => 'product_1', 'Category' => 'ABC', 'ItemsSold' => '1'),
        2 => array('item' => 'product_2', 'Category' => 'DEF')
        );  

我卡在了类似的东西上:

$result = array();
foreach ($arrayOffered as $keyOffered => $offeredSubArr)
{
    $item = $offeredSubArr['item'];
    foreach($arraySold as $keySold => $soldSubArr)
    {
        if(isset($soldSubArr['item']) && $soldSubArr['item'] == $item) 
        {   
            $i = 0;
            $test = array_merge($offeredSubArr, $soldSubArr);
            $result[$i][] = $test;
            $i++;
        }
        else 
        {
          $result[$i][] = $offeredSubArr;
          $i++;
        }
    }
}

问题:
- 输出数组没有按照我想要的方式格式化
- 我知道我没有朝着正确的方向前进。你能给我一个提示吗?

$result = array();
            foreach ($arrayOffered as $keyOffered => $offeredSubArr)
            {
                $item = $offeredSubArr['item'];
                foreach($arraySold as $keySold => $soldSubArr)
                { $i = 0;
                    if(isset($soldSubArr['item']) && $soldSubArr['item'] == $item) 
                    {   

                        $test = array_merge($offeredSubArr, $soldSubArr);                       
                        $result[$i][] = $test;

                    }
                    else 
                    {

                        $result[$i][] = $offeredSubArr;                   

                    }


                    $i++;
                }
            }
            $result = $result[0];
            echo '<pre>'; print_r($result); die();

这是一个选项,因为你有这个 $arrayOffered 作为一种主文件我建议用这个数组构建一个散列并稍后在 foreach 中使用查找出售的数组。

$arrayOffered = array(
          0 => array('item' => 'product_1', 'Category' => 'ABC'), 
          1 => array('item' => 'product_2', 'Category' => 'DEF')
          );  

$arraySold = array(
          0 => array('item' => 'product_1', 'ItemsSold' => '2', 'ItemsReturned' => 1), //arrays in this array can contain up to 30 elements
          1 => array('item' => 'product_1', 'ItemsSold' => '1')
          );

//Build a hash to get the extra properties
$hashArray = array();
foreach ($arrayOffered as $offered) {
    $hashArray[$offered['item']]=$offered;
}

$resultArray = array();
foreach ($arraySold as $sold) {
    $hashItem = $hashArray[$sold['item']];  
    // you dont want this sold flag on your final result
    unset($hashItem['sold']);
    $resultArray[]=array_merge($hashItem,$sold);
    $hashArray[$sold['item']]['sold']= true;
}
//Add all the missing hash items
foreach($hashArray as $hashItem){
    if(!isset($hashItem['sold'])){
        $resultArray[]=$hashItem; 
    }
}
print_r($resultArray);  

测试样本 http://sandbox.onlinephpfunctions.com/code/f48ceb3deb328088209fbaef4f01d8d4430478db

好吧,尽管有更简单的解决方案,但我会尝试遵循您的逻辑。 首先,我们需要在多维数组中进行搜索,这就是为什么我们需要 this so thread

中的 followed 函数的原因
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
           return true;
        }
     }
     return false;
 }

小改动后的下一步:

  • $i 你不需要在每个循环中将它设为零一次,所以把它放在外面
  • 不必要的 [] ($result[$i][]) 你不需要空括号没有理由在 $i 行中创建一个额外的 table 因为你在那里添加了什么, $测试本身已经 table
  • 添加最后一个循环,因为当 sth 不在第二个 table 中时,它将被添加到每个循环中的新 table 中,据我所知,你不想要那种重复项

我们有以下代码:

 $arrayOffered = array(
      0 => array('item' => 'product_1', 'Category' => 'ABC'), 
      1 => array('item' => 'product_2', 'Category' => 'DEF')
      );  

 $arraySold = array(
      0 => array('item' => 'product_1', 'ItemsSold' => '2', 'ItemsReturned' => 1), //arrays in this array can contain up to 30 elements
      1 => array('item' => 'product_1', 'ItemsSold' => '1')
      );
 $i = 0;
 $result = array();
 foreach ($arrayOffered as $keyOffered => $offeredSubArr)
 {
     $item = $offeredSubArr['item'];
     foreach($arraySold as $keySold => $soldSubArr)
     {
          if(isset($soldSubArr['item']) && $soldSubArr['item'] == $item) 
          {   
               $test = array_merge($offeredSubArr, $soldSubArr);
               $result[$i] = $test;
               $i++;
          }
     }
}
foreach ($arrayOffered as $value)
{
     if (!in_array_r($value['item'], $result))
     {
          $result[$i] = $value;
          $i++;
     }
 }
 print_r($result);

据我测试,这给出了想要的结果。