Разделить массив на два массива по индексу четным или нечетным

У меня есть этот массив:

$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:

  1. все элементы {foreach $data.all as $article}...{/foreach}
  2. нечетные элементы {foreach $data.odd as $article}...{/foreach}
  3. даже элементы только {foreach $data.even as $article}...{/foreach}

Надеюсь, это поможет некоторым людям …

 $odd = []; $even = []; while (count($arr)) { $odd[] = array_shift($arr); $even[] = array_shift($arr); }