Объединить многомерный массив в соответствии с условиями - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть следующие массивы:

array (size=6)
  'ID' => int 786
  'userID' => int 97291
  'tip_index' => string 'CARS' (length=11)
  'tip_apa' => string 'calda' (length=5)
  'citire' => string '2' (length=1)
  'data' => string '2020-04-21 15:32:49' (length=19)
C:\wamp64\www\test2.php:19:
array (size=6)
  'ID' => int 785
  'userID' => int 97291
  'tip_index' => string 'TRUCKS' (length=9)
  'tip_apa' => string 'calda' (length=5)
  'citire' => string '1' (length=1)
  'data' => string '2020-04-21 15:32:49' (length=19)
C:\wamp64\www\test2.php:19:
array (size=6)
  'ID' => int 784
  'userID' => int 97291
  'tip_index' => string 'MOTORCYCLES' (length=4)
  'tip_apa' => string 'calda' (length=5)
  'citire' => string '1' (length=1)
  'data' => string '2020-04-21 15:32:49' (length=19)
C:\wamp64\www\test2.php:19:
array (size=6)
  'ID' => int 783
  'userID' => int 97291
  'tip_index' => string 'CARS' (length=11)
  'tip_apa' => string 'calda' (length=5)
  'citire' => string '1' (length=1)
  'data' => string '2020-03-21 15:32:44' (length=19)
C:\wamp64\www\test2.php:19:
array (size=6)
  'ID' => int 782
  'userID' => int 97291
  'tip_index' => string 'TRUCKS' (length=9)
  'tip_apa' => string 'calda' (length=5)
  'citire' => string '0' (length=1)
  'data' => string '2020-03-21 15:32:41' (length=19)
C:\wamp64\www\test2.php:19:
array (size=6)
  'ID' => int 781
  'userID' => int 97291
  'tip_index' => string 'MOTORCYCLES' (length=4)
  'tip_apa' => string 'calda' (length=5)
  'citire' => string '0' (length=1)
  'data' => string '2020-03-21 15:32:39' (length=19)

Я ожидаю вывода 3 многомерных массивов, подобных этой, сгруппированных по tip_index и tip_apa, где я добавляю несколько пользовательских ключей для каждого tip_apa (например: для tip_apa = rece Я хочу добавить массив data_iv_rece, number_iv_rece, data_in_rece, number_in_rece). Каждый tip_apa имеет дату и значение последнего месяца, а также дату и значение этого месяца следующим образом:

array (size=3)
  'CARS' => 
    array (size=2)
      'rece' => 
        array (size=4)
          'data_iv_rece' => string '22.03.2020' (length=10)
          'number_iv_rece' => string '1' (length=1)
          'data_in_rece' => string '22.04.2020' (length=10)
          'number_in_rece' => string '0' (length=1)
      'calda' => 
        array (size=4)
          'data_iv_calda' => string '22.03.2020' (length=10)
          'number_iv_calda' => string '1' (length=1)
          'data_in_calda' => string '22.04.2020' (length=10)
          'number_in_calda' => string '0' (length=1)
  'TRUCKS' => 
    array (size=2)
      'rece' => 
        array (size=4)
          'data_iv_rece' => string '22.03.2020' (length=10)
          'number_iv_rece' => string '1' (length=1)
          'data_in_rece' => string '22.04.2020' (length=10)
          'number_in_rece' => string '0' (length=1)
      'calda' => 
        array (size=4)
          'data_iv_calda' => string '22.03.2020' (length=10)
          'number_iv_calda' => string '1' (length=1)
          'data_in_calda' => string '22.04.2020' (length=10)
          'number_in_calda' => string '0' (length=1)
  'MOTORCYCLES' => 
    array (size=2)
      'rece' => 
        array (size=4)
          'data_iv_rece' => string '22.03.2020' (length=10)
          'number_iv_rece' => string '1' (length=1)
          'data_in_rece' => string '22.04.2020' (length=10)
          'number_in_rece' => string '0' (length=1)
      'calda' => 
        array (size=4)
          'data_iv_calda' => string '22.03.2020' (length=10)
          'number_iv_calda' => string '1' (length=1)
          'data_in_calda' => string '22.04.2020' (length=10)
          'number_in_calda' => string '0' (length=1)

Вот то, что пыталось выполнить в течение последних 2 дней без получения ожидаемого результата:

 $userID   = $_SESSION['ID'];
 $info  = $db->query("SELECT * FROM `indecsi` WHERE `userID` = '$userID'")->fetchAll();
 $arrayInfos = array();
 foreach ($info as $key => $val) 
    {
        $month= date('m',strtotime($val['data']));

        if(date($month < date('m')) && $val['tip_apa'] == 'rece')
        {
            $data_iv_rece = $val['data'];
            $number_iv_rece = $val['citire'];
            $arrayInfos += [ 'data_iv_rece' => $data_iv_rece ];
            $arrayInfos += [ 'number_iv_rece' => $number_iv_rece ];
        }

        if(date($month == date('m')) && $val['tip_apa'] == 'rece')
        {
            $data_in_rece = $val['data'];
            $number_in_rece = $val['citire'];
            $arrayInfos += [ "data_in_rece" => $data_in_rece ];
            $arrayInfos += [ "number_in_rece" => $number_in_rece ];
        }

        if(date($month < date('m')) && $val['tip_apa'] == 'calda')
        {
            $data_iv_calda = $val['data'];
            $number_iv_calda = $val['citire'];
            $arrayInfos += [ 'data_iv_calda' => $data_iv_calda ];
            $arrayInfos += [ 'number_iv_calda' => $number_iv_calda ];
        }

        if(date($month == date('m')) && $val['tip_apa'] == 'calda')
        {
            $data_in_calda = $val['data'];
            $number_in_calda = $val['citire'];
            $arrayInfos += [ "data_in_calda" => $data_in_calda ];
            $arrayInfos += [ "number_in_calda" => $number_in_calda ];
        }
    }

И, наконец, пытаемся получить 3 массива в таблице:

 $consum_rece = $number_in_rece - $number_iv_rece;
 $consum_calda = $number_in_calda - $number_iv_calda;
 $table.= "<tr class='text-center'>";
 $table.= "<td>" . str_replace('_', ' ' , $val['tip_index']) . "</td>";
 $table.= "<td>" . $arrayInfos['data_in_rece'] . "</td>";
 $table.= "<td>" . $arrayInfos['number_in_rece'] . "</td>";
 $table.= "<td>" . $arrayInfos['data_iv_rece'] . "</td>";
 $table.= "<td>" . $arrayInfos['number_iv_rece'] . "</td>";
 $table.= "<td>" . $consum_rece . "</td>";
 $table.= "<td>" . $arrayInfos['data_in_calda'] . "</td>";
 $table.= "<td>" . $arrayInfos['number_in_calda'] . "</td>";
 $table.= "<td>" . $arrayInfos['data_iv_calda'] . "</td>";
 $table.= "<td>" . $arrayInfos['number_iv_calda'] . "</td>";
 $table.= "<td>" . $consum_calda . "</td>";
 $table.= "<td>-</td>";
 $table.= "</tr>";

enter image description here

Пробовал несколько вещей, например array_push, array_merge, array_diff чтобы получить ожидаемый результат, но не повезло. Я чувствую, что я на полпути и не могу понять это правильно. Любые советы, пожалуйста? Спасибо!

1 Ответ

1 голос
/ 22 апреля 2020

Поначалу меня немного смутило ваше объяснение, но я думаю, что выяснил, что ожидается.

Предположим, у вас уже есть этот массив php (собранный из MySQL или другого place):

$all_vehicles = array(
  array(
    'id' => 786,
    'userID' => 9791,
    'tip_index' => 'CARS',
    'tip_apa' => 'calda',
    'citire' => 2,
    'data' => '2020-04-21 15:32:49'
  ),  
  array(
    'id' => 785,
    'userID' => 9791,
    'tip_index' => 'TRUCKS',
    'tip_apa' => 'calda',
    'citire' => 1,
    'data' => '2020-04-21 15:32:49'
  ), 
  array(
    'id' => 784,
    'userID' => 97291,
    'tip_index' => 'MOTORCYCLES',
    'tip_apa' => 'calda',
    'citire' => 1,
    'data' => '2020-04-21 15:32:49'
  ), 
  array(
    'id' => 783,
    'userID' => 97291,
    'tip_index' => 'CARS',
    'tip_apa' => 'calda',
    'citire' => 1,
    'data' => '2020-03-21 15:32:44'
  ), 
  array(
    'id' => 782,
    'userID' => 97291,
    'tip_index' => 'TRUCKS',
    'tip_apa' => 'calda',
    'citire' => 0,
    'data' => '2020-03-21 15:32:41'
  ), 
  array(
    'id' => 781,
    'userID' => 97291,
    'tip_index' => 'MOTORCYCLES',
    'tip_apa' => 'calda',
    'citire' => 0,
    'data' => '2020-03-21 15:32:39'
  ),
);

Я бы предложил прокрутить массив и обновить нужные значения. Я автоматизировал его, чтобы удалить if и elses, добавив «data_in_» - Значение.

Затем добавьте их в многомерный массив, чтобы разделить автомобили, грузовики и мотоциклы.

$ordered_vehicles = array();
foreach($all_vehicles as $val)
{
    $month= date('m',strtotime($val['data']));

    if($month <= date('m') && in_array($val['tip_apa'],array('rece','calda')))
    {
        $data = date('d.m.Y',strtotime($val['data']));
        // Convert the data in the required format DD.MM.YYYY
        $number = $val['citire'];

        $val['data_in_'.$val['tip_apa']] =  $data;
        $val['number_in_'.$val['tip_apa']] =  $number;
    }

    $ordered_vehicles[$val['tip_index']][$val['tip_apa']][] = $val;
}

Ожидаемый Результатом будет многомерный массив с 3 дочерними массивами - легковые автомобили, грузовики и мотоциклы. Каждый из них имеет несколько массивов внутри с необходимыми данными.

В моем случае это выглядит так:

Array
(
    [CARS] => Array
        (
            [calda] => Array
                (
                    [0] => Array
                        (
                            [id] => 786
                            [userID] => 9791
                            [tip_index] => CARS
                            [tip_apa] => calda
                            [citire] => 2
                            [data] => 2020-04-21 15:32:49
                            [data_in_calda] => 21.04.2020
                            [number_in_calda] => 2
                        )

                    [1] => Array
                        (
                            [id] => 783
                            [userID] => 97291
                            [tip_index] => CARS
                            [tip_apa] => calda
                            [citire] => 1
                            [data] => 2020-03-21 15:32:44
                            [data_in_calda] => 21.03.2020
                            [number_in_calda] => 1
                        )

                )

        )

    [TRUCKS] => Array
        (
            [calda] => Array
                (
                    [0] => Array
                        (
                            [id] => 785
                            [userID] => 9791
                            [tip_index] => TRUCKS
                            [tip_apa] => calda
                            [citire] => 1
                            [data] => 2020-04-21 15:32:49
                            [data_in_calda] => 21.04.2020
                            [number_in_calda] => 1
                        )

                    [1] => Array
                        (
                            [id] => 782
                            [userID] => 97291
                            [tip_index] => TRUCKS
                            [tip_apa] => calda
                            [citire] => 0
                            [data] => 2020-03-21 15:32:41
                            [data_in_calda] => 21.03.2020
                            [number_in_calda] => 0
                        )

                )

        )

    [MOTORCYCLES] => Array
        (
            [calda] => Array
                (
                    [0] => Array
                        (
                            [id] => 784
                            [userID] => 97291
                            [tip_index] => MOTORCYCLES
                            [tip_apa] => calda
                            [citire] => 1
                            [data] => 2020-04-21 15:32:49
                            [data_in_calda] => 21.04.2020
                            [number_in_calda] => 1
                        )

                    [1] => Array
                        (
                            [id] => 781
                            [userID] => 97291
                            [tip_index] => MOTORCYCLES
                            [tip_apa] => calda
                            [citire] => 0
                            [data] => 2020-03-21 15:32:39
                            [data_in_calda] => 21.03.2020
                            [number_in_calda] => 0
                        )

                )

        )

)

После этого вы можете распечатать и изменить данные по своему желанию. Пожалуйста, укажите ниже, если я что-то упустил в процессе. Приветствия.

...