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

时间:2015-02-16 13:15:12

标签: php arrays multidimensional-array

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

  • 如果 $ arraySold 中存在来自 $ arrayOffered 的键'item'的值,则这两个元素都应包含在数组 $ result 中。如果对于 $ arrayOffered 中的1个元素, $ arraySold 中有3个元素,我还应该在 $ result 中获得3个元素。
  • 否则, $ arrayOffered 中的元素应添加到 $ result 中。

$ 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++;
        }
    }
}

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

3 个答案:

答案 0 :(得分:2)

这是一个选项,因为你有这个$ 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

答案 1 :(得分:1)

$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();

答案 2 :(得分:1)

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

后面的函数
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行中创建一个额外的表,因为你在那里添加了,$ test已经是表了本身
  • 当第二个表格不在第二个表格中时添加最后一个循环因为它会在每个循环中添加到新表格中,并且只要我不想要那种重复项目

我们有以下代码:

 $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);

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