2016-01-25 144 views
1

我有3套数组的已经从一个API($数组1,$数组2,$ ARRAY3)返回PHP多维数组合并

我需要最高这些组合成1个对象地面,第二天,一夜之间的价格价值。

$obj['ground'] should equal 3.15 
$obj['2 Day'] should equal 19.29 
$obj['Overnight'] should equal 29.26 

ARR1

Array 
(
    [0] => Array 
     (
      [Title] => Ground 
      [Price] => 3.15 
     ) 

    [1] => Array 
     (
      [Title] => 2 Day 
      [Price] => 12.11 
     ) 

    [2] => Array 
     (
      [Title] => 1 Day 
      [Price] => 29.26 
     ) 

) 

ARR2

Array 
(
    [0] => Array 
     (
      [Title] => Ground 
      [Price] => 3.15 
     ) 

    [1] => Array 
     (
      [Title] => 2 Day 
      [Price] => 19.29 
     ) 

    [2] => Array 
     (
      [Title] => 1 Day 
      [Price] => 25.89 
     ) 

) 

ARR3

Array 
(
    [0] => Array 
     (
      [Title] => Ground 
      [Price] => 3.15 
     ) 

    [1] => Array 
     (
      [Title] => 2 Day 
      [Price] => 16.29 
     ) 

    [2] => Array 
     (
      [Title] => 1 Day 
      [Price] => 25.89 
     ) 

) 

什么是这样做的最佳方式?

+0

我认为最好是亲自动手做;只需做你需要做的事情,而不依赖那些虚拟的PHP函数。 'array_merge'在循环中很有用。 – Smar

+0

还有[other](http://stackoverflow.com/questions/18814453/php-multi-dimentional-array-merge?rq=1)[similar](http://stackoverflow.com/questions/26064428/ array-merge-with-multi-dimentional-array?rq = 1)[posts](http://stackoverflow.com/questions/26952165/merging-multi-dimentional-arrays?rq=1)... – Smar

回答

2

一种不同的方法。更实用,更简单,更不容易出错。

// Prepare result 
$result = array_fill_keys([ 'ground', '2 Day', '1 Day' ], 0.0); 

// Find the highest price and keep it in the result 
$result = array_reduce(array_merge($array1, $array2, $array3), function ($result, $item) { 
    if ($item['Price'] > $result[$item['Title']]) { 
     $result[$item['Title']] = $item['Price']; 
    } 
    return $result; 
}, $result); 

print_r($result); 

输出:

Array 
(
    [ground] => 3.15 
    [2 Day] => 19.29 
    [1 Day] => 29.26 
) 

这种方法的好处是,它依靠内置的功能,可以很容易地扩展到更多的冠军和多个阵列。

0

您可以将您所需要的结果:

<? 
// Your test array 1 
$arr1[] = array('Title'=>'Ground','Price'=>'3.15'); 
$arr1[] = array('Title'=>'2 Day','Price'=>'12.11'); 
$arr1[] = array('Title'=>'1 Day','Price'=>'29.26'); 

foreach ($arr1 as $key => $value) { 
    $newArr[$value['Title']] = $value['Price'];  
} 

echo "<pre>"; 
print_r($newArr); // result of array1, you can follow this for other arrays as well 
?> 

结果:

Array 
(
    [Ground] => 3.15 
    [2 Day] => 12.11 
    [1 Day] => 29.26 
) 

更新1:

<? 
$arr1[] = array('Title'=>'Ground','Price'=>'3.15'); 
$arr1[] = array('Title'=>'2 Day','Price'=>'12.11'); 
$arr1[] = array('Title'=>'1 Day','Price'=>'29.26'); 

$arr2[] = array('Title'=>'Ground','Price'=>'3.15'); 
$arr2[] = array('Title'=>'2 Day','Price'=>'19.29'); 
$arr2[] = array('Title'=>'1 Day','Price'=>'25.89'); 

$arr3[] = array('Title'=>'Ground','Price'=>'3.15'); 
$arr3[] = array('Title'=>'2 Day','Price'=>'16.29'); 
$arr3[] = array('Title'=>'1 Day','Price'=>'25.89'); 

$customArr = array(); 
foreach ($arr1 as $key => $value) { 
    $customArr[$key][$value['Title']][] = $value['Price'];  
} 

foreach ($arr2 as $key => $value) { 
    $customArr[$key][$value['Title']][] = $value['Price'];  
} 

foreach ($arr3 as $key => $value) { 
    $customArr[$key][$value['Title']][] = $value['Price'];  
} 

$finalArr = array(); 
foreach ($customArr as $key => $value) { 

    if(isset($value['Ground'])) 
     $finalArr['Ground'] = max($value['Ground']); 

    if(isset($value['2 Day'])) 
     $finalArr['2 Day'] = max($value['2 Day']); 

    if(isset($value['1 Day'])) 
     $finalArr['1 Day'] = max($value['1 Day']); 
} 

echo "<pre>"; 
print_r($finalArr);  

?> 

结果:

Array 
(
    [Ground] => 3.15 
    [2 Day] => 19.29 
    [1 Day] => 29.26 
) 
+0

怎么样arr2,arr3? – Brad

+0

如果其他2与arr1分开,比你可以遵循相同的过程.. @Brad – devpro

+0

那么“结合这些成最高价格的1个对象”... – Brad

2
 $array1 = array(
     array("Title"=>"ground", "Price"=>3.15), 
     array("Title"=>"2 Day", "Price"=>12.11), 
     array("Title"=>"1 Day", "Price"=>29.26) 
     ); 
    $array2 = array(
     array("Title"=>"ground", "Price"=>3.15), 
     array("Title"=>"2 Day", "Price"=>19.29), 
     array("Title"=>"1 Day", "Price"=>25.89) 
    ); 
    $array3 = array(
     array("Title"=>"ground", "Price"=>3.15), 
     array("Title"=>"2 Day", "Price"=>16.29), 
     array("Title"=>"1 Day", "Price"=>25.89) 
    ); 
    $obj = new stdClass(); /** you asked object. */ 
    $size = count($array1); 
/** Loops runs three time, `ground`, `2 Day` and `1 Day` will be sorted respectively in each iteration */ 
    for ($i = 0; $i<$size; $i++) { 
     $maxValue = max(array($array1[$i]["Price"], $array2[$i]["Price"], $array3[$i]["Price"])); 
     switch ($array1[$i]["Title"]) { 
      case "ground": $obj->ground = $maxValue; 
       break; 
      /** '2 day' is not possible since object properties can not contain space. */ 
      case "2 Day": $obj->twoDay = $maxValue; 
       break; 
      case "1 Day": $obj->overNight = $maxValue; 
       break; 
     } 
    } 
    var_dump($obj); 
+0

您是否知道如何使用预设数量的阵列进行此项工作。 (它可能有2个或2000个)。 – Brad

+0

你能指定输入吗? ?比我可以尝试:) –

+1

@RajeshKumar考虑使用更简单的方法来避免错误(请参阅我的答案) – Michael