Split array into two arrays by index even or odd

前端 未结 10 2075
执笔经年
执笔经年 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 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 ));
    

提交回复
热议问题