Как объединить массив в случае, если одно и то же имя в массиве

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

Actual Array:
(
[0] => Array
(
[Time] => 00:45
[PlottingType] => Research
)

[1] => Array
(
[Time] => 00:45
[PlottingType] => admin
)

[2] => Array
(
[Time] => 00:45
[PlottingType] => admin
)

[3] => Array
(
[Time] => 00:45
[PlottingType] => Research
)

[4] => Array
(
[Time] => 00:30
[PlottingType] => Research
)

)

Expected Array:

Array
(
[0] => Array
(
[Time] => 01:30
[PlottingType] => Research
)

[1] => Array
(
[Time] => 01:30
[PlottingType] => admin
))

Вычислите время одного и того же типа печати в один индекс в один массив. Поэтому, пожалуйста, предложите подходящее решение.

0

Решение

$data = array(
array('Time' => '00:45', 'PlottingType' => 'Research'),
array('Time' => '00:45', 'PlottingType' => 'admin'),
array('Time' => '00:45', 'PlottingType' => 'admin'),
array('Time' => '00:45', 'PlottingType' => 'Research'),
array('Time' => '00:30', 'PlottingType' => 'Research'),
);

print_r(array_reduce($data, function($result, $item) {
$key = $item['PlottingType'];
if (!isset($result[$key]))
$result[$key] = $item;
else
{
list($h1, $m1) = explode(':', $result[$key]['Time']);
list($h2, $m2) = explode(':', $item['Time']);
$time = ($h1 + $h2) * 60 + $m1 + $m2;
$h = floor($time / 60);
$m = $time % 60;
$result[$key]['Time'] = str_pad($h, 2, "0", STR_PAD_LEFT) . ':' .
str_pad($m, 2, "0", STR_PAD_LEFT);
}
return $result;
}, array()));

Можно играть с strtotime а также date, но я не хотел, поэтому код немного длиннее. Если вы хотите удалить окончательные ключи из результата — примените функцию array_values к этому.

Результат

Array
(
[Research] => Array
(
[Time] => 02:00
[PlottingType] => Research
)

[admin] => Array
(
[Time] => 01:30
[PlottingType] => admin
)

)

PS: и другой способ

print_r(array_reduce($data, function($result, $item) {
$key = $item['PlottingType'];
if (!isset($result[$key]))
$result[$key] = $item;
else
{
$time = strtotime('0:' . $result[$key]['Time']);
list($h, $m) = explode(':', $item['Time']);
$time = strtotime('+' . $h . ' minutes', $time);
$time = strtotime('+' . $m . ' seconds', $time);
$result[$key]['Time'] = date('i:s', $time);
}
return $result;
}, array()));

Здесь я использовал минуты как секунды, а часы как минуты, поэтому ответ мог иметь более 24 часов, вплоть до 60.

pps: хорошо, вы не можете назначить это переменной самостоятельно, я запишу это для вас

$data = array_values(array_reduce($data, function($result, $item) {
$key = $item['PlottingType'];
if (!isset($result[$key]))
$result[$key] = $item;
else
{
$time = strtotime('0:' . $result[$key]['Time']);
list($h, $m) = explode(':', $item['Time']);
$time = strtotime('+' . $h . ' minutes', $time);
$time = strtotime('+' . $m . ' seconds', $time);
$result[$key]['Time'] = date('i:s', $time);
}
return $result;
}, array()));
0

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

$expectedarray = array();
foreach($ar as $yourmainarray)
{
foreach($u as $expectedarray)
{
if($ar['PlottingType'] == $u['PlottingType'])
{
$u['Time'] = $u['Time'] + $ar['Time'];
}
else
{
array_push($ar, $expectedarray);
}
}
}

это даст вывод, как это

   [0] => Array
(
[Time] => 2:00
[PlottingType] => Research
)

[1] => Array
(
[Time] => 01:30
[PlottingType] => admin
)

Вы можете проверить это как

foreach($u as $expectedarray)
{
print_r($u);
}
0

Похоже, вы пытаетесь удалить дубликаты в массиве. В этом случае используйте array_unique() функция.

$expectedarray = array_unique($actualarray);
print_r($expectedarray);

Если вы хотите посчитать значения, используйте array_count_values() Intead array_unique()

Для получения дополнительной информации обратитесь сюда: http://php.net/manual/en/function.array-unique.php

0

Хорошо. Я удаляю старый ответ, а это новый рабочий. Я надеялся, что вы можете сделать небольшие изменения, необходимые.

function add_minutes($time_1, $time_2) {
$temp = explode(':', $time_1);
$hr_1 = $temp[0]; $min_1 = $temp[1];
$temp = explode(':', $time_2);
$hr_2 = $temp[0]; $min_2 = $temp[1];

$min_2 = $min_2+$min_1;
$min_1 = intval($min_2/60);
$hr_2 = $hr_2 + $hr_1;
$hr_2 += $min_1;
$min_2 = $min_2%60;
$min_2 = sprintf('%02d', $min_2); $hr_2 = sprintf('%02d', $hr_2);
return $hr_2.':'.$min_2;
}

$actual_array = array();
$actual_array[] = array('Time' => '01:45', 'PlottingType' => 'Research');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'admin');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'admin');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'Research');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'Research');

$single_array = array();

foreach($actual_array as $val) {
if (key_exists($val['PlottingType'], $single_array)) {
$single_array[$val['PlottingType']] = add_minutes($val['Time'], $single_array[$val['PlottingType']]);
} else {
$single_array[$val['PlottingType']] = $val['Time'];
}
}

$output_array = array();
foreach ($single_array as $key => $value) {
$output_array[] = array('PlottingType' => $key, 'Time' => $value);
}

// $output_array this is your answer.
echo '<pre>'; var_dump($output_array);
0