PHP взорвался в массиве

Мне было интересно, можно ли преобразовать следующий массив:

Array ( "2016-03-03 19:17:59", "2016-03-03 19:20:54", "2016-05-03 19:12:37" ) 

В этом:

 Array ( "2016-03-03", "2016-03-03", "2016-05-03" ) 

Без создания каких-либо циклов?

Нет явных циклов, если вы можете использовать array_map , хотя внутренне это петли:

 function format_date($val) { $v = explode(" ", $val); return $v[0]; } $arr = array_map("format_date", $arr); 

Из руководства PHP:

array_map() возвращает массив, содержащий все элементы array1 после применения функции callback к каждому из них. Количество параметров, которые принимает функция callback должно соответствовать количеству массивов, переданных в array_map() .

Кроме того, когда вы имеете дело со Датами, правильный способ:

 return date("Ymd", strtotime($val)); 

Простым способом использования петель является использование foreach() :

 foreach($arr as $key => $date) $arr[$key] = date("Ymd", strtotime($date)); 

Это самый простой цикл, который я могу придумать, рассматривая index как что угодно.


Входные данные :

 <?php $arr = array( "2016-03-03 19:17:59", "2016-03-03 19:20:54", "2016-05-03 19:12:37" ); function format_date($val) { $v = explode(" ", $val); return $v[0]; } $arr = array_map("format_date", $arr); print_r($arr); 

Вывод

 Array ( [0] => 2016-03-03 [1] => 2016-03-03 [2] => 2016-05-03 ) 

Демо: http://ideone.com/r9AyYV

Да, используйте карту:

 function first10($s) { return substr($s, 0, 10); } $result = array_map("first10", $yourArray); 

ПРЕДУПРЕЖДЕНИЕ : это хорошее решение, только если вы уверены, что формат даты не изменяется, другими словами, первые 10 символов должны содержать дату.

Ответ Правэна Кумара, вероятно, является лучшим решением, но есть способ сделать то, что на самом деле не было замечено как цикл. вместо этого вы используете рекурсию

 function explodeNoLoop($array,$delim,$index=0) { $returnArr = array(); if(isset($array[$index])) { $expldoed = explode($delim,$array[$index]); array_push($returnArr,$expldoed[0]); } if(isset($array[$index+1])) { $returnArr = array_merge($returnArr,explodeNoLoop($array,$delim,$index+1)); } return $returnArr; } $myArr = array ( "2016-03-03 19:17:59", "2016-03-03 19:20:54", "2016-05-03 19:12:37" ); var_dump(explodeNoLoop($myArr," ")); 

пример

Как работает этот код, так это то, что с помощью функции мы взорвали массив в индексе, предоставляемом параметром функции, и добавим это в наш возвращаемый массив. Затем мы проверяем, есть ли значение, установленное в следующем индексе, который равен +1 индекса, который мы передали в функцию. Если он существует, мы снова вызываем функцию с новым индексом с тем же массивом и разделителем. Затем мы объединяем результаты этого с нашим возвратным массивом, а затем возвращаем его.

Тем не менее, с этим нужно быть осторожным с ошибками уровня гнезда, где вы часто вызываете функцию слишком много раз, например, глядя на отражение зеркала в зеркале.