Как передать данные из основного массива в несколько массивов в PHP - PullRequest
3 голосов
/ 29 мая 2019

У меня есть массив с подмассивами, у каждого подмассива есть 'type' (int) и 'datetime'. Мне нужно циклически обработать массив и создать новые массивы (или объекты) с группами этих подмассивов особым образом: каждый тип может быть [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, каждый реестр подряд.

EDIT:

Я знаю, что мне нужно использовать цикл, но я не знаю, как "получить первый элемент с типом 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;

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

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Для этого случая подойдет простой foreach, за которым следует регистр переключателя,

$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;
    }
}

Демо-ссылка .

2 голосов
/ 29 мая 2019

Это просто случай зацикливания каждого из исходных значений массива и создания записи во временном массиве (в данном случае $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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...