У меня есть массив с подмассивами, каждый подмассив имеет «тип» (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;
Я не знаю, как продолжить.
Это просто случай перебора каждого из значений исходного массива и создания записи во временном массиве (в данном случае $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;
}
}
Довольно просто с циклом, у вас есть попытка? Но было бы проще и логичнее просто использовать
0
,1
и т. д. вместоregistry0
,registry1
.