PHP Merge и группировать массивы и суммировать их - PullRequest
0 голосов
/ 20 июня 2019

У меня есть следующие массивы, которые возвращают значения, основанные на определенных вычислениях:

print_r($adult_array);
print_r($children_array);
print_r($senior_array);

//Adult array start
Array
(
    [0] => Array
    (
        [travel_plan] => Business
        [premium_price] => 1336.81
        [eligibility] => Up to 75 Yrs
        [lower_limit] => 0
        [upper_limit] => 75
        [no_travellers] => 2
    )

    [1] => Array
    (
        [travel_plan] => Holiday
        [premium_price] => 22960.81
        [eligibility] => Up to 75 Yrs
        [lower_limit] => 0
        [upper_limit] => 75
        [no_travellers] => 2
    )

    [2] => Array
    (
        [travel_plan] => Schengen
        [premium_price] => 11740.81
        [eligibility] => Up to 75 Yrs
        [lower_limit] => 0
        [upper_limit] => 75
        [no_travellers] => 2
    )

    [3] => Array
    (
        [travel_plan] => Student
        [premium_price] => 22960.81
        [eligibility] => Up to 30 Yrs
        [lower_limit] => 0
        [upper_limit] => 30
        [no_travellers] => 2
    )
)
//Adult array end 

//Children array start 
Array
(
    [0] => Array
    (
        [travel_plan] => Student
        [premium_price] => 5740.205
        [eligibility] => Up to 30 Yrs
        [lower_limit] => 0
        [upper_limit] => 30
        [no_travellers] => 1
    )
)
//Children array end 

//Senior array start
Array
(
    [0] => Array
    (
        [travel_plan] => Senior
        [premium_price] => 38714.41
        [eligibility] => 76 to 85 Yrs
        [lower_limit] => 76
        [upper_limit] => 85
        [no_travellers] => 1
    )
)
//Senior array end

Приведенный выше вывод массива извлекается и сохраняется различными переменными.Я хотел бы объединить / сгруппировать массивы в зависимости от плана поездки и одновременно суммировать премиальные тарифы для всех аналогичных планов поездки.Таким образом, существует только один массив для каждого плана командировки и сумма премиальной цены за план командировки.

Как этого добиться?Вывод должен быть следующим:

    Array(
        [0]=>Array(
            [travel_plan] => Business
            [premium_price] => 1336.81
            [eligibility] => Up to 75 Yrs
            [lower_limit] => 0
            [upper_limit] => 75
            [no_travellers] => 2
        )
        [1]=>Array(
            [travel_plan] => Holiday
            [premium_price] => 22960.81
            [eligibility] => Up to 75 Yrs
            [lower_limit] => 0
            [upper_limit] => 75
            [no_travellers] => 2
        )
        [2]=>Array(
            [travel_plan] => Schengen
            [premium_price] => 11740.81
            [eligibility] => Up to 75 Yrs
            [lower_limit] => 0
            [upper_limit] => 75
            [no_travellers] => 2
        )
        [3]=>Array(
            [travel_plan] => Student
            [premium_price] => 28701.015
            [eligibility] => Up to 30 Yrs
            [lower_limit] => 0
            [upper_limit] => 30
            [no_travellers] => 2
        )
        [4]=>Array(
            [travel_plan] => Senior
            [premium_price] => 38714.41
            [eligibility] => Up to 30 Yrs
            [lower_limit] => 0
            [upper_limit] => 30
            [no_travellers] => 1
        )
    )

Я пробовал следующую функцию, но она суммирует все значения в одно:

        $final_package = array();

        foreach ($travel_plan as $key => $values) {

            foreach ($values as $label => $count) {


                // Create a node in the array to store the value
                if (!array_key_exists($label, $final_package)) {
                    $final_package[$label] = 0;
                }
                // Add the value to the corresponding node
                if(is_string($count)){
                  $final_package[$label] = $count;  
                }else{
                   $final_package[$label] += $count; 
                }

            }
        }

// Sort the array in descending order of values
        arsort($final_package);

        print_r($final_package);

Предоставляя мне следующий вывод в качестве окончательного массива:

Array
(
    [premium_price] => 103453.855
    [travel_plan] => Senior
    [upper_limit] => 85
    [eligibility] => 76 to 85 Yrs
    [lower_limit] => 76
    [no_travellers] => 1
)

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Эта логика решит 90% вашей проблемы, все, что вам нужно сделать, это извлечь верхний и нижний пределы.

$bigArray = array_merge($adult_array, $senior_array, $children_array);


$BusinessTravels =  sortByTravelPlan('Business', $bigArray);
$StudentTravels =  sortByTravelPlan('Student', $bigArray);
$SeniorTravels =  sortByTravelPlan('Senior', $bigArray);
$SchengenTravels =  sortByTravelPlan('Schengen', $bigArray);

print_r($BusinessTravels);
print_r($StudentTravels);
print_r($SeniorTravels);

$finalResult = array_merge($BusinessTravels, $StudentTravels, $SeniorTravels, $SchengenTravels );


function sortByTravelPlan($type, $bigArray){
    $Array = [];
    foreach ($bigArray as $key => $value) {
        if($value['travel_plan'] == $type){
            array_push($Array, $bigArray[$key]);
        }
    }
    return processArray($Array);
}

function processArray($array){
    $result = [];

    $prev_price = null;
    $max_age = null;
    foreach ($array as $key => $value) {
        $result['travel_plan'] = $value['travel_plan'];
        if($value['premium_price'] > $prev_price){
             $result['premium_price'] = $value['premium_price'];
        }
    }

    $result['upper_limit']  = 30;
    $result['lower_limit']  = 0;
    $result['no_travellers'] = count($array);
    return $result;
}

Вывод, полученный из вашего массива, ниже https://3v4l.org/4X2ts#output

0 голосов
/ 06 июля 2019

Вы можете попробовать этим способом.

$full_array = array_merge($adult_array,$children_array,$senior_array);
$result = [];
foreach($full_array as $item){
    // Count how many index
    if(isset($result[$item['travel_plan']])){
        $result[$item['travel_plan']] += 1;
    }else{
        $result[$item['travel_plan']] = 1;
    }

    // Sum total value
    if(isset($result[$item['travel_plan'].'_total'])){
        $result[$item['travel_plan'].'_total'] =         $result[$item['travel_plan'].'_total'] + $item['premium_price'];
    }else{
        $result[$item['travel_plan'].'_total'] = $item['premium_price'];
    }
}
0 голосов
/ 20 июня 2019

array_merge(array1,array2,....) будет вашим ответом. Вот пример.

$a = [
  [
      'travel_plan '=>'Schengen',
      'premium_price '=>'Rs 1,200'
    ],
  [
      'travel_plan '=>'Business ',
      'premium_price '=>'Rs 1,300'
    ]
];

$b = [
  [
      'travel_plan '=>'Senior ',
      'premium_price '=>'Rs 1,600'
    ]
];

$c =array_merge ($a,$b);
echo '<pre>';
print_r($c);

Вывод будет таким

Array
(
    [0] => Array
        (
            [travel_plan ] => Schengen
            [premium_price ] => Rs 1,200
        )

    [1] => Array
        (
            [travel_plan ] => Business 
            [premium_price ] => Rs 1,300
        )

    [2] => Array
        (
            [travel_plan ] => Senior 
            [premium_price ] => Rs 1,600
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...