Разделить массив на два массива по индексу четный или нечетный
у меня есть этот массив:
$array = array(a, b, c, d, e, f, g);
Я хочу разделить его на два массива в зависимости от того, четный или нечетный индекс, например:
$odd = array(a, c, e, g);
$even = array(b, d, f);
спасибо заранее!
8 ответов
одно решение, используя анонимные функции и 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++;
}
как почти-один-лайнер, я думаю, что это будет мое любимое:
$even = $odd = array();
foreach( $array as $k => $v ) $k % 2 ? $odd[] = $v : $even[] = $v;
или еще чуть-чуть? скорость:
$even = $odd = array();
foreach( $array as $k => $v ) ( $k & 1 ) === 0 ? $even[] = $v : $odd[] = $v;
немного более подробный вариант:
$both = array( array(), array() );
// or, if $array has at least two elements:
$both = array();
foreach( $array as $k => $v ) $both[ $k % 2 ][] = $v;
list( $even, $odd ) = $both;
С array_chunk
:
$even = $odd = array();
foreach( array_chunk( $array, 2 ) as $chunk ){
list( $even[], $odd[] ) = isset( $chunk[1]) ? $chunk : $chunk + array( null, null );
// or, to force even and odd arrays to have the same count:
list( $even[], $odd[] ) = $chunk + array( null, null );
}
если $ array гарантированно имеет четное количество элементов:
$even = $odd = array();
foreach( array_chunk( $array, 2 ) as $chunk )
list( $even[], $odd[] ) = $chunk;
в PHP 5.5.0+ с array_column
:
$chunks = array_chunk( $array, 2 );
$even = array_column( $chunks, 0 );
$odd = array_column( $chunks, 1 );
что-то подобное для более старых версий PHP.
Ключи будут 0,2,4,... и 1,3,5,.... Если нет ... вот так, примените array_values
тоже:
$even = array_intersect_key( $array, array_flip( range( 0, count( $array ), 2 )));
$odd = array_intersect_key( $array, array_flip( range( 1, count( $array ), 2 )));
или
$even = array_intersect_key( $array, array_fill_keys( range( 0, count( $array ), 2 ), null ));
$odd = array_intersect_key( $array, array_fill_keys( range( 1, count( $array ), 2 ), null ));
просто цикл, хотя их и проверить, если ключ четный или нечетный:
$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 В3. Это для отображения новостей / блога с одной или двумя моделями шаблонов столбцов.
после запроса 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);
}