Как суммировать значения другого ключа, если это же значение для другого ключа в ассоциативном массиве в PHP?

Пожалуйста, обратитесь к следующему массиву в PHP:

$array1 = array(
array('location'=>'AA','time_spent'=>2),
array('location'=>'BB','time_spent'=>2),
array('location'=>'AA','time_spent'=>3),
array('location'=>'CC','time_spent'=>2),
array('location'=>'CC','time_spent'=>2),
array('location'=>'AA','time_spent'=>1)
);

Здесь я хочу рассчитать общее время, которое он провел в каждом конкретном месте, то есть накопить значение ключа time_spent если ключ для location такой же. А затем записать его в новый ассоциативный массив (скажем, $place_array) со значениями, связанными с ключами location а также total_time,

Таким образом, выходной массив должен быть

$place_array = array(
array('location'=>'AA','time_spent'=>6),
array('location'=>'BB','time_spent'=>2),
array('location'=>'CC','time_spent'=>4)
);

0

Решение

Мой ответ показывает вам, как я получу нужный вам массив, а также фактический массив, который я использовал бы, если бы я был кодирующим. Если бы все, что мне было нужно, это сводка мест и общего потраченного времени, я бы имел дело с более компактным массивом, в котором не нужно было хранить метки. В любом случае, если вы не хотите использовать итоговый бит, просто удалите его, если считаете, что эта версия более компактна 🙂

    $journey = array(
array('location'=>'AA','time_spent'=>2),
array('location'=>'BB','time_spent'=>2),
array('location'=>'AA','time_spent'=>3),
array('location'=>'CC','time_spent'=>2),
array('location'=>'CC','time_spent'=>2),
array('location'=>'AA','time_spent'=>1)
);

$summary = Array();
$full    = Array();
foreach($journey as $map){

// Your version
if(!isset($full[$map["location"]])){
$full[$map["location"]] = $map;
} else {
$full[$map["location"]]["time_spent"] += $map["time_spent"];
}

// Summary version (leaner)
$summary[$map["location"]] = (isset($summary[$map["location"]])?$summary[$map["location"]]:0)+$map["time_spent"];
}

// Summary result
print "<pre>";
print_r($summary);
print "</pre>";

// Your result
print "<pre>";
print_r(array_values($full));
print "</pre>";

Выход

Array
(
[AA] => 6
[BB] => 2
[CC] => 4
)

Array
(
[0] => Array
(
[location] => AA
[time_spent] => 6
)

[1] => Array
(
[location] => BB
[time_spent] => 2
)

[2] => Array
(
[location] => CC
[time_spent] => 4
)

)
1

Другие решения

Привет, ты можешь попробовать это.

Я создал новый массив $result с его ключом в качестве местоположения сказать AA и в этом у меня есть сохранить массив, который имеет местоположение как AA и его время, проведенное в следующий раз, когда я проверяю, если местоположение AA затем добавьте время, потраченное на предыдущее, а если нет, то добавьте новое. В последний раз я использовал array_values поменять ключи

    <?php
$array1 = array(array('location'=>'AA','time_spent'=>2),array('location'=>'BB','time_spent'=>2),array('location'=>'AA','time_spent'=>3),array('location'=>'CC','time_spent'=>2),array('location'=>'CC','time_spent'=>2),array('location'=>'AA','time_spent'=>1));
$result = array();
foreach($array1 as $new){
if (array_key_exists($new['location'],$result)){
$result[$new['location']]['time_spent'] += $new['time_spent'];
}
else{
$result[$new['location']] = $new;
}
}
$final = $new_array=array_values($result);
echo "<pre>";print_r($final);

Выход

    Array
(
[0] => Array
(
[location] => AA
[time_spent] => 6
)

[1] => Array
(
[location] => BB
[time_spent] => 2
)

[2] => Array
(
[location] => CC
[time_spent] => 4
)

)
1

<?php

$array1 = array(
array('location'=>'AA','time_spent'=>2),
array('location'=>'BB','time_spent'=>2),
array('location'=>'AA','time_spent'=>3),
array('location'=>'CC','time_spent'=>2),
array('location'=>'CC','time_spent'=>2),
array('location'=>'AA','time_spent'=>1)
);

$place_array = array();
foreach ($array1 as $key => $value) {
if(isset($place_array[$value['location']]))
$place_array[$value['location']]['time_spent'] += $value['time_spent'];
else
$place_array[$value['location']] = $value;
}
$place_array = array_values($place_array);
echo '<pre>';
print_r($place_array);
echo '</pre>';
?>

Выход

Array
(
[0] => Array
(
[location] => AA
[time_spent] => 6
)

[1] => Array
(
[location] => BB
[time_spent] => 2
)

[2] => Array
(
[location] => CC
[time_spent] => 4
)
)
1