通过索引偶数或奇数将数组拆分为两个数组

Mar*_*eno 17 php arrays split

我有这个数组:

$array = array(a, b, c, d, e, f, g);
Run Code Online (Sandbox Code Playgroud)

我希望将它拆分为两个数组,具体取决于索引是偶数还是奇数,如下所示:

$odd = array(a, c, e, g);

$even = array(b, d, f);
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Jon*_*Jon 33

一种解决方案,使用匿名函数和array_walk:

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

这只是在数组中一次传递中分隔项目,但它在"聪明"方面有点过分.它并不比经典更好,更冗长

$odd = array();
$even = array();
foreach ($array as $k => $v) {
    if ($k % 2 == 0) {
        $even[] = $v;
    }
    else {
        $odd[] = $v;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我一直在寻找一些优雅的解决方案,但最终以简单冗长的解决方案结束。更容易理解和维护。 (2认同)

Gar*_*eth 11

用途array_filter:

$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);
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,似乎从PHP 5.6开始,如果将`ARRAY_FILTER_USE_KEY`传递给可选的第三个参数,则可以使用键而不是值来使用`array_filter`. (7认同)
  • 随机开车降票促使我更新答案以包括上述更改。 (2认同)

biz*_*lop 6

作为一个几乎单行的人,我认为这将是我最喜欢的:

\n\n
$even = $odd = array();\nforeach( $array as $k => $v )  $k % 2  ?  $odd[] = $v  :  $even[] = $v;\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者再多一点点?速度:

\n\n
$even = $odd = array();\nforeach( $array as $k => $v )  ( $k & 1 ) === 0  ?  $even[] = $v  :  $odd[] = $v;\n
Run Code Online (Sandbox Code Playgroud)\n\n

更详细一点的变体:

\n\n
$both = array( array(), array() );\n// or, if $array has at least two elements:\n$both = array();\n\nforeach( $array as $k => $v )  $both[ $k % 2 ][] = $v;\nlist( $even, $odd ) = $both;\n
Run Code Online (Sandbox Code Playgroud)\n\n

array_chunk

\n\n
$even = $odd = array();\nforeach( array_chunk( $array, 2 ) as $chunk ){\n  list( $even[], $odd[] ) = isset( $chunk[1]) ? $chunk : $chunk + array( null, null );\n  // or, to force even and odd arrays to have the same count:\n  list( $even[], $odd[] ) = $chunk + array( null, null );\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果保证 $array 有偶数个元素:

\n\n
$even = $odd = array();\nforeach( array_chunk( $array, 2 ) as $chunk )\n  list( $even[], $odd[] ) = $chunk;\n
Run Code Online (Sandbox Code Playgroud)\n\n

PHP 5.5.0+ 具有array_column

\n\n
$chunks = array_chunk( $array, 2 );\n$even = array_column( $chunks, 0 );\n$odd  = array_column( $chunks, 1 );\n
Run Code Online (Sandbox Code Playgroud)\n\n

旧 PHP 版本的情况类似。\n密钥将为 0,2,4,\xe2\x80\xa6 和 1,3,5,\xe2\x80\xa6。如果你不喜欢这个,array_values也可以应用:

\n\n
$even = array_intersect_key( $array, array_flip( range( 0, count( $array ), 2 )));\n$odd  = array_intersect_key( $array, array_flip( range( 1, count( $array ), 2 )));\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
$even = array_intersect_key( $array, array_fill_keys( range( 0, count( $array ), 2 ), null ));\n$odd  = array_intersect_key( $array, array_fill_keys( range( 1, count( $array ), 2 ), null ));\n
Run Code Online (Sandbox Code Playgroud)\n


Flu*_*feh 5

我不确定这是否是最优雅的方式,但它应该很有魅力:

$odd=array();
$even=array();
$count=1;
foreach($array as $val)
{
    if($count%2==1)
    {
        $odd[]=$val;
    }
    else
    {
        $even[]=$val;
    }
    $count++;
}
Run Code Online (Sandbox Code Playgroud)