У меня есть этот массив:
$array = array(a, b, c, d, e, f, g);
Я хочу разбить его на два массива в зависимости от того, является ли индекс четным или нечетным, например:
$odd = array(a, c, e, g); $even = array(b, d, f);
Заранее спасибо!
Одно решение, использующее анонимные функции и array_walk
:
$odd = array(); $even = array(); $both = array(&$even, &$odd); array_walk($array, function($v, $k) use ($both) { $both[$k % 2][] = $v; });
Это разделяет элементы всего за один проход по массиву, но это немного на «умной» стороне. Это не лучше, чем классика, более многословная
$odd = array(); $even = array(); foreach ($array as $k => $v) { if ($k % 2 == 0) { $even[] = $v; } else { $odd[] = $v; } }
Использовать array_filter
:
$odd=array_filter($array, function ($input) {return $input & 1;}); $even=array_filter($array, function ($input) {return !($input & 1);});
Я не уверен, что это самый элегантный способ, но он должен работать в обаянии:
$odd=array(); $even=array(); $count=1; foreach($array as $val) { if($count%2==1) { $odd[]=$val; } else { $even[]=$val; } $count++; }
Просто зациклируйте их и проверьте, является ли ключ четным или нечетным:
$odd = array(); $even = array(); foreach( $array as $key => $value ) { if( 0 === $key%2) { //Even $even[] = $value; } else { $odd[] = $value; } }
Один
$odd = $even = array(); for ($i = 0, $l = count($array ); $i < $l;) { // Notice how we increment $i each time we use it below, by two in total $even[] = $array[$i++]; if($i < $l) { $odd[] = $array[$i++]; } }
Два
$odd = $even = array(); foreach (array_chunk($array , 2) as $chunk) { $even[] = $chunk[0]; if(!empty( $chunk[1])) { $odd[] = $chunk[1]; } }
Основываясь на втором варианте @ Jon, я сделал это для использования с движком PHP Smarty v3 . Это для отображения новостей / блога с одной или двумя шаблонами шаблонов.
После запроса MySql я сделаю следующий код:
if(sizeof($results) > 0) { $data = array(); foreach($results as $k => $res) { if($k % 2 == 0) { $res["class"] = "even"; $data["all"][] = $data["even"][] = $res; } else { $res["class"] = "odd"; $data["all"][] = $data["odd"][] = $res; } } }
Я получаю массив из 3 подматриц (включая нечетный / четный класс) с использованием синтаксиса Smarty:
{foreach $data.all as $article}...{/foreach}
{foreach $data.odd as $article}...{/foreach}
{foreach $data.even as $article}...{/foreach}
Надеюсь, это поможет некоторым людям …
$odd = []; $even = []; while (count($arr)) { $odd[] = array_shift($arr); $even[] = array_shift($arr); }