Назначить определенный ключ элементам массива

#php #arrays

#php #массивы

Вопрос:

У меня есть массив следующим образом :-

 $alldatesandtimes = ["2016-10-04 00:00:01","2016-10-04 23:59:59","2016-10-05 00:00:01","2016-10-05 23:59:59","2016-10-06 00:00:01","2016-10-06 23:59:59"]
  

Я хочу назначить datein в качестве индекса первого элемента и dateout для 2-го элемента. Затем datein в качестве индекса 3-го элемента и dateout для 4-го элемента и так далее и тому подобное для всех остальных элементов.

итак, первый индекс должен быть datein, а 2-й индекс должен быть dateout, затем продолжайте до последнего элемента.

У меня есть следующий код :-

 $keys = array();
$result = array();
for($j=0; $j<((sizeof($alldatesandtimes))/2); $j  )
{
  $keys[] = "datein";
  $keys[] = "dateout";
}//end for loop

for($i = 0; $i< sizeof($alldatesandtimes); $i  )
{
  $result[][$keys[$i]] =$alldatesandtimes[$i];
}
  

он возвращает следующий массив :-

 $result = Array ( [0] => Array ( [datein] => 2016-10-04 00:00:01 ) [1] => Array ( [dateout] => 2016-10-04 23:59:59 ) [2] => Array ( [datein] => 2016-10-05 00:00:01 ) [3] => Array ( [dateout] => 2016-10-05 23:59:59 ) [4] => Array ( [datein] => 2016-10-06 00:00:01 ) [5] => Array ( [dateout] => 2016-10-06 23:59:59 ) )
  

но я хочу

 $result = ['datein' => '2016-10-04 00:00:01', 'dateout' => '2016-10-04 23:59:59', 'datein' => '2016-10-05 00:00:01', .....
  

Пожалуйста, помогите мне?

Комментарии:

1. невозможные индексы должны быть уникальными.

2. просто добавьте свои ключи в исходный массив

3. Итак, я предположил, $result[][$keys[$i]] что вы хотите многомерность, если нет, то см. Комментарий @RobertParham.

Ответ №1:

Вы можете разбить его на пары, а затем объединить пары значений с парой ключей:

 foreach(array_chunk($alldatesandtimes, 2) as $pair) {
    $result[] = array_combine(['datein', 'dateout'], $pair);
}
  

Ответ №2:

Не так причудливо, как ответ Абры, но…

 $newDates = array();
$dateHolder = array();
foreach($alldatesandtimes as $k=>$v){
    $key = $k%2===0 ? "dateIn" : "dateOut";
    $newDates[$key] = $v;
    if(count($newDates)===2){
        $dateHolder[] = $newDates;
        $newDates = array();
    }
}
$alldatesandtimes = $dateHolder;
  

https://3v4l.org/BCoYd

Ответ №3:

Вы можете зациклить массив, увеличив переменную $ i на два ($ i 2). Таким образом, вы все получаете каждый второй элемент. после этого назначьте новый массив другому массиву следующим образом

 $result[]=array("datein"=>$arr[$i], "dateout" => $arr[$i 1]);
  

Комментарии:

1. если вы делаете это так, предполагая, что $ i увеличивается только на единицу в каждом цикле, конечная дата всегда будет начальной датой для следующего массива.

2. Я явно упомянул, что цикл должен увеличивать $ i 2 вместо $ i

3. я этого не видел, но было бы проще и понятнее, если бы вы просто добавили цикл к ответу..