我有 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
)