Как передать данные из главного массива в несколько массивов в PHP

У меня есть массив с подмассивами, каждый подмассив имеет «тип» (int) и «дату и время». Мне нужно перебрать массив и создать новые массивы (или объекты) с группами этих подмассивов особым образом: каждый «тип» может быть [0-3] 0 означает начальную дату и 3 означает конечную дату (1 и 2 находятся между для других целей). Каждый новый массив с этими подмассивами должен начинаться с 0 и заканчиваться на 3.

Я не использую никакой фреймворк, только PHP5 и jQuery. Основной массив получается из цикла, который я создал из SQL-запроса с помощью GROUP_CONCAT. Я только что передал поля concat в главный массив, но мне нужно перегруппировать подмассивы, чтобы создать какой-то тип реестров.

Вот массив, который я получил с подмассивами. Они уже отсортированы по дате и времени, каждый тип «0» означает «дата начала/начала нового реестра», а «3» означает «дата окончания/конец реестра».

$array = [
["tipo"=>0,"fechahora"=>"2019-05-26 09:35:30"],
["tipo"=>1,"fechahora"=>"2019-05-26 10:30:15"],
["tipo"=>2,"fechahora"=>"2019-05-26 10:43:12"],
["tipo"=>3,"fechahora"=>"2019-05-26 14:30:26"],
["tipo"=>0,"fechahora"=>"2019-05-26 15:35:22"],
["tipo"=>3,"fechahora"=>"2019-05-26 16:35:31"],
["tipo"=>0,"fechahora"=>"2019-05-27 08:31:57"],
["tipo"=>1,"fechahora"=>"2019-05-27 10:27:22"],
["tipo"=>2,"fechahora"=>"2019-05-27 10:38:31"],
["tipo"=>3,"fechahora"=>"2019-05-27 14:20:38"],
["tipo"=>0,"fechahora"=>"2019-05-28 09:39:42"],
["tipo"=>1,"fechahora"=>"2019-05-28 11:43:08"],
["tipo"=>2,"fechahora"=>"2019-05-28 11:53:19"],
["tipo"=>3,"fechahora"=>"2019-05-28 14:43:31"],
["tipo"=>0,"fechahora"=>"2019-05-29 10:30:22"],
["tipo"=>3,"fechahora"=>"2019-05-29 14:38:46"]
];

Мне нужно создать новый массив с подмассивами или объектами по реестру, реестр — это элемент, у которого есть начальная дата (тип 0), промежуточные даты (тип 1,2) и конечная дата (тип 3). Это важно. Дата начала следующего подмассива более актуальна, чем дата окончания более старого подмассива. Каждый массив "tipo"+"fechahora" имеет больше полей (подпись, адрес и т. д.), поэтому мне нужно сохранить их как подмассивы:

$newarray = [
    'registry0' => [ 
            "startdate"=> ["tipo"=>0,"fechahora"=>"2019-05-26 09:35:30"],
            "pauses"=> [
                ["tipo"=>1,"fechahora"=>"2019-05-26 10:30:15"],
                ["tipo"=>2,"fechahora"=>"2019-05-26 10:43:12"]
            ],
            "enddate" => ["tipo"=>3,"fechahora"=>"2019-05-26 14:30:26"]
        ],
    'registry1' => [ 
            "startdate"=> ["tipo"=>0,"fechahora"=>"2019-05-26 15:35:22"],
            "pauses"=> [],
            "enddate" => ["tipo"=>3,"fechahora"=>"2019-05-26 16:35:31"]
        ],
    'registry2' => [  
            "startdate"=> ["tipo"=>0,"fechahora"=>"2019-05-27 08:31:57"],
            "pauses"=> [
                ["tipo"=>1,"fechahora"=>"2019-05-27 10:27:22"],
                ["tipo"=>2,"fechahora"=>"2019-05-27 10:38:31"]
            ],
            "enddate" => ["tipo"=>3,"fechahora"=>"2019-05-27 14:20:38"]
    ]
];

Я мог бы использовать массивы или объекты, я не знаю, как разработать цикл для перегруппировки таких массивов (начиная с одного значения поля и заканчивая другим и так далее). Я даже не знаю, есть ли более простой способ. Любая помощь будет оценена по достоинству.

Если это может помочь: мне нужно, чтобы реестры таким образом помещались в HTML-таблицу, каждый реестр подряд.

Обновлено:

Я знаю, что мне нужно использовать цикл, но я не знаю, как "получить первый элемент с типом 0, создать массив, включить элемент, включить все остальные элементы до типа 3, закрыть массив, создать новый массив и так далее..."

В каком-то коде:

$newarray = [];
foreach($array as $element) {
if ($element["tipo"]==0) {
  //new subarray
  //include this in subarray
}
// include all "tipos" 1,2 in subarray
if ($element["tipo"]==3) {
  //include this in subarray
  //finish subarray
}
//incude subarray in $newarray
}
return $newarray;

Я не знаю, как продолжить.

Довольно просто с циклом, у вас есть попытка? Но было бы проще и логичнее просто использовать 0, 1 и т. д. вместо registry0, registry1.

AbraCadaver 29.05.2019 17:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это просто случай перебора каждого из значений исходного массива и создания записи во временном массиве (в данном случае $temp) с любыми значениями в соответствии с типом. Затем, когда будет найден тип 3, добавление этого к $newarray...

$newarray = [];
$temp = [];
$count = 0;
foreach ( $array as $entry )    {
    if ( $entry['tipo'] == 0 )  {
        $temp = [ 'startdate' => $entry ];
    }
    else if ( $entry['tipo'] == 3 ) {
        $temp["enddate"] = $entry;
        $newarray["registry".$count++] = $temp;
    }
    else    {
        $temp["pauses"][] = $entry;
    }
}
Ответ принят как подходящий

В этом случае подойдет простой foreach, за которым следует switch case,

$result = [];
$i      = 0;
$var = 3; // you can manage this at your will
foreach ($array as $key => $value) {
    switch ($value['tipo']) { // passing tipo value here
        case 0:
            // it will capture for same record for current value of $i
            $result['registry' . $i]['startdate'] = $value; 
            break;
        case $var:
            // detects last entry and will increment
            $result['registry' . $i++]['enddate'] = $value; 
            break;
        default:
            // if not 0 and $var then push it in pauses
            $result['registry' . $i]['pauses'][] = $value; 
            break;
    }
}

Демонстрационная ссылка.

Другие вопросы по теме