PHP 多维数组合并


PHP multi-dimentional array merge

我有 3 组数组从 API 返回 ($array 1,$array 2,$array 3)

我需要将它们组合成 1 个具有 Ground、第 2 天、隔夜最高价格值的对象。

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

到达1

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

到达2

Array
(
    [0] => Array
        (
            [Title] => Ground
            [Price] => 3.15
        )
    [1] => Array
        (
            [Title] => 2 Day
            [Price] => 19.29
        )
    [2] => Array
        (
            [Title] => 1 Day
            [Price] => 25.89
        )
)

到达3

Array
(
    [0] => Array
        (
            [Title] => Ground
            [Price] => 3.15
        )
    [1] => Array
        (
            [Title] => 2 Day
            [Price] => 16.29
        )
    [2] => Array
        (
            [Title] => 1 Day
            [Price] => 25.89
        )
)

最好的方法是什么?

一种不同的方法。功能更强大,更简单,更不容易出错。

// 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
)

这种方法的好处是它依赖于内置函数,可以很容易地扩展到更多的标题和更多的数组。

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

您可以将所需的结果作为:

<?
// 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
)