Мне было интересно, можно ли преобразовать следующий массив:
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 индекса, который мы передали в функцию. Если он существует, мы снова вызываем функцию с новым индексом с тем же массивом и разделителем. Затем мы объединяем результаты этого с нашим возвратным массивом, а затем возвращаем его.
Тем не менее, с этим нужно быть осторожным с ошибками уровня гнезда, где вы часто вызываете функцию слишком много раз, например, глядя на отражение зеркала в зеркале.