Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按索引偶数或奇数将数组拆分为两个数组_Php_Arrays_Split - Fatal编程技术网

Php 按索引偶数或奇数将数组拆分为两个数组

Php 按索引偶数或奇数将数组拆分为两个数组,php,arrays,split,Php,Arrays,Split,我有这个阵列: $array = array(a, b, c, d, e, f, g); 我想根据索引是偶数还是奇数将其拆分为两个数组,如下所示: $odd = array(a, c, e, g); $even = array(b, d, f); 提前谢谢 我不确定这是否是最优雅的方式,但它应该具有魅力: $odd=array(); $even=array(); $count=1; foreach($array as $val) { if($count%2==1) {

我有这个阵列:

$array = array(a, b, c, d, e, f, g);
我想根据索引是偶数还是奇数将其拆分为两个数组,如下所示:

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

$even = array(b, d, f);

提前谢谢

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

$odd=array();
$even=array();
$count=1;
foreach($array as $val)
{
    if($count%2==1)
    {
        $odd[]=$val;
    }
    else
    {
        $even[]=$val;
    }
    $count++;
}
使用(PHP>=5.6):


只需在它们之间循环并检查键是偶数还是奇数:

$odd = array();
$even = array();
foreach( $array as $key => $value ) {
    if( 0 === $key%2) { //Even
        $even[] = $value;
    }
    else {
        $odd[] = $value;
    }
}

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

这只需在数组的一次遍历中分离项目,但有点“聪明”。它实际上并不比经典的更冗长的版本好

$odd = array();
$even = array();
foreach ($array as $k => $v) {
    if ($k % 2 == 0) {
        $even[] = $v;
    }
    else {
        $odd[] = $v;
    }
}
一个


基于@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语法:

  • 所有项目
    {foreach$data.all as$article}…{/foreach}
  • 仅奇数项
    {foreach$data.odd as$article}…{/foreach}
  • 仅偶数项
    {foreach$data.偶为$article}…{/foreach}

  • 希望它能帮助一些人…

    作为一个几乎一行的句子,我想这将是我最喜欢的:

    $odd = [];
    $even = [];
    while (count($arr)) {
        $odd[] = array_shift($arr);
        $even[] = array_shift($arr);
    }
    
    $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;
    
    使用
    数组\u块

    $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\u列

    $chunks = array_chunk( $array, 2 );
    $even = array_column( $chunks, 0 );
    $odd  = array_column( $chunks, 1 );
    
    对于较旧的PHP版本,情况类似。 按键将为0,2,4…和1,3,5,…。如果您不喜欢此操作,请也应用
    数组\u值

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

    
    输出:
    原件:0123456789
    偶数:02468
    单数:13579
    
    还有一个带有数组块和数组映射的功能解决方案。当源数组的大小为奇数时,最后一行从第二个数组中删除空项

    list($odd, $even) = array_map(null, ...array_chunk($ar,2));
    if(count($ar) % 2) array_pop($even);
    

    b
    d
    f
    的键是
    1
    3
    5
    。。。您确定他们不应该是
    $odd
    ?请尽量避免将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。请编辑你的答案,包括不,我不是。你的答案太短了,以至于它落在了低质量的审查队列中。我的评论没有冒犯的意思,你的回答也没有错,这就是为什么我投票不删除它,但对你所做的做一个基本的解释将是有用的。一句简单的话将使你的答案质量加倍,这将有助于未来的新用户,并提高你获得+1的几率。这是一个双赢的局面。我是一个简单的人。我不需要投票。我绝对不在乎“质量审查”算法“认为”我应该做什么。@DoubleThink,我觉得是的。但我们希望,每一个经过充分解释的答案,即使是微不足道的,都能学到一个学徒式的更干净的代码。允许代码大师在代码输出过程中获得更多不间断的时刻,从而改变世界。;)请解释您的代码块给表带来了什么。有两个循环,一个用于偶数索引,另一个用于奇数索引。正如您在输出中看到的,它将首先打印原始数组,然后按第一个循环打印偶数数组,然后按第二个数组打印奇数数组。所以数组被分为两部分,偶数和奇数。我的意思是,把它解释为对答案的补充。我同意。这个答案缺少教育性的解释。我已经寻找了一些优雅的解决方案,但最终得到了一个简单而冗长的解决方案。它更易于理解和维护。不幸的是,这种技术将在输入数组上进行两次完整的传递。这个缺点并没有出现在公认的答案中——Jon的两个解决方案都只对输入数组进行了一次遍历。我喜欢您的
    array\u chunk()
    array\u column()
    示例,非常清晰。它不需要偶数个元素。谢谢。我不知道我是否还能想出这些解决办法
    $even = $odd = array();
    foreach( array_chunk( $array, 2 ) as $chunk )
      list( $even[], $odd[] ) = $chunk;
    
    $chunks = array_chunk( $array, 2 );
    $even = array_column( $chunks, 0 );
    $odd  = array_column( $chunks, 1 );
    
    $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 ));
    
        <?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
    
    list($odd, $even) = array_map(null, ...array_chunk($ar,2));
    if(count($ar) % 2) array_pop($even);