Split array into two arrays by index even or odd

前端 未结 10 1972
执笔经年
执笔经年 2020-11-30 12:37

I have this array:

$array = array(a, b, c, d, e, f, g);

I want to split it in two arrays depending if the index is even or odd, like this:<

相关标签:
10条回答
  • 2020-11-30 12:43

    I am not sure if this is the most elegant way, but it should work a charm:

    $odd=array();
    $even=array();
    $count=1;
    foreach($array as $val)
    {
        if($count%2==1)
        {
            $odd[]=$val;
        }
        else
        {
            $even[]=$val;
        }
        $count++;
    }
    
    0 讨论(0)
  • 2020-11-30 12:44
        <?php
    
    $array1 = array(0,1,2,3,4,5,6,7,8,9);
    $oddarray = array();
    $evenarray = array();
    
    $count = 1;
    
    echo "Original: ";
    foreach ($array1 as $value)
     {
        echo "$value";
    }
    
    echo "<br> Even: ";
    
    foreach ($array1 as $print) 
    {
        if ($count%2==1) 
        {
            $evenarray = $print;
            echo "$print";
        }
        $count++;
    }
    
    echo "<br> Odd: ";
    
    foreach ($array1 as $print2) {
        if ($count%2!=1) 
        {
            $oddarray[] = $print2;
            echo "$print2";
        }
        $count++;
    }
    
    ?>
    
    Output:
    
    Original: 0123456789
    Even: 02468
    Odd: 13579
    
    0 讨论(0)
  • 2020-11-30 12:48

    One solution, using anonymous functions and array_walk:

    $odd = array();
    $even = array();
    $both = array(&$even, &$odd);
    array_walk($array, function($v, $k) use ($both) { $both[$k % 2][] = $v; });
    

    This separates the items in just one pass over the array, but it's a bit on the "cleverish" side. It's not really any better than the classic, more verbose

    $odd = array();
    $even = array();
    foreach ($array as $k => $v) {
        if ($k % 2 == 0) {
            $even[] = $v;
        }
        else {
            $odd[] = $v;
        }
    }
    
    0 讨论(0)
  • 2020-11-30 12:50

    Based on @Jon's second variant, I made this following for use with PHP Smarty v3 template engine. This is for displaying news/blog with both one or two columns template model.

    After the MySql query I'll do the following code :

    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;
            }
        }
    }
    

    I obtain an array of 3 sub-arrays (including odd/even class) with Smarty syntax of use :

    1. all items {foreach $data.all as $article}...{/foreach}
    2. odd items only {foreach $data.odd as $article}...{/foreach}
    3. even items only {foreach $data.even as $article}...{/foreach}

    Hope it helps some people...

    0 讨论(0)
  • 2020-11-30 12:52

    Use array_filter (PHP >= 5.6):

    $odd = array_filter($array, function ($input) {return $input & 1;}, ARRAY_FILTER_USE_KEY);
    $even = array_filter($array, function ($input) {return !($input & 1);}, ARRAY_FILTER_USE_KEY);
    
    0 讨论(0)
  • 2020-11-30 13:08

    As an almost-one-liner, I think this will be my favourite:

    $even = $odd = array();
    foreach( $array as $k => $v )  $k % 2  ?  $odd[] = $v  :  $even[] = $v;
    

    Or for a tiny little more? speed:

    $even = $odd = array();
    foreach( $array as $k => $v )  ( $k & 1 ) === 0  ?  $even[] = $v  :  $odd[] = $v;
    

    A bit more verbose variant:

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

    With 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 );
    }
    

    If $array is guaranteed to have even number of elements:

    $even = $odd = array();
    foreach( array_chunk( $array, 2 ) as $chunk )
      list( $even[], $odd[] ) = $chunk;
    

    PHP 5.5.0+ with array_column:

    $chunks = array_chunk( $array, 2 );
    $even = array_column( $chunks, 0 );
    $odd  = array_column( $chunks, 1 );
    

    Something similar for older PHP versions. The keys will be 0,2,4,… and 1,3,5,…. If you don't like this, apply an array_values too:

    $even = array_intersect_key( $array, array_flip( range( 0, count( $array ), 2 )));
    $odd  = array_intersect_key( $array, array_flip( range( 1, count( $array ), 2 )));
    

    or

    $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 ));
    
    0 讨论(0)
提交回复
热议问题