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

0

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

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
    Можно ли предположить, что вы используете PHP? (на основе вашего образца)
  • 0
    да, сэр, используя php.
Показать ещё 4 комментария
Теги:
arrays
array-merge

4 ответа

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: ok, вы не можете назначить его переменной самостоятельно, я запишу ее для вас

$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
    ответ правильный, но который является окончательным массивом для возврата. потому что вы печатаете весь массив.
  • 0
    удалите функцию print_r() и присвойте результат другой переменной.
Показать ещё 5 комментариев
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
    это правильно, но я также хочу рассчитать время того же типа печати.
  • 0
    Вы хотите сумму time_plot?
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
    Просьба конвертировать время в минуту.
  • 0
    Отображение неправильного времени, если я выберу разность 1 час во времени, это показывает 10 минут ..
Показать ещё 2 комментария
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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню