【问题标题】:Split array into two arrays by index even or odd按索引偶数或奇数将数组拆分为两个数组
【发布时间】:2012-09-06 11:34:14
【问题描述】:

我有这个数组:

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

我想根据索引是偶数还是奇数将它分成两个数组,如下所示:

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

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

提前致谢!

【问题讨论】:

  • bdf 的键是 135...你确定它们不应该是 $odd

标签: php arrays split


【解决方案1】:

一种解决方案,使用匿名函数和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;
    }
}

【讨论】:

  • 我已经搜索了一些优雅的解决方案,但完成了简单的详细解决方案。更容易理解和维护。
【解决方案2】:

使用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);

【讨论】:

  • 不幸的是,这种技术将在输入数组上进行两次完整的传递。这个缺点不会出现在公认的答案中——Jon 的两个解决方案都对输入数组进行了一次传递。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    作为一个几乎单线的人,我认为这将是我的最爱:

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

    【讨论】:

    • 我喜欢你的array_chunk()array_column() 的例子,非常干净。它不需要偶数个元素。
    • 谢谢。我想知道我是否还能想出这些解决方案。 :)
    【解决方案5】:

    使用 array_chunk 和 array_map 的更多功能解决方案。当源数组的大小为奇数时,最后一行从第二个数组中删除空项

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        一个

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

        【讨论】:

          【解决方案8】:

          基于@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;
                  }
              }
          }
          

          我使用 Smarty 使用语法获得了一个包含 3 个子数组(包括奇/偶类)的数组:

          1. 所有项目{foreach $data.all as $article}...{/foreach}
          2. 仅奇数项{foreach $data.odd as $article}...{/foreach}
          3. 仅偶数项{foreach $data.even as $article}...{/foreach}

          希望它可以帮助一些人......

          【讨论】:

            【解决方案9】:
            $odd = [];
            $even = [];
            while (count($arr)) {
                $odd[] = array_shift($arr);
                $even[] = array_shift($arr);
            }
            

            【讨论】:

            • 请尽量避免仅仅将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。请编辑您的答案以包含clarification, context and try to mention any limitations, assumptions or simplifications in your answer.
            • 不,我不是。您的回答太短了,以至于进入了低质量审核队列。我的评论没有冒犯的意思,您的回答也没有错,这就是为什么我投票不将其删除的原因,但是对您正在做的事情的基本解释会很有用。一个简单的句子将使您的答案质量提高一倍,这有助于未来的新用户,并提高您获得 +1 的机会。这是一个双赢的局面。
            • 我是一个简单的人。我不需要选票。而且我绝对不在乎“质量审查”算法“认为”我应该做什么。
            • @DoubleThink,我觉得你。但希望是每个完全解释的答案,即使是微不足道的,也可以学习 Padawan 更清洁的代码。让代码大师多一些不间断的代码输出瞬间改变世界。 ;)
            【解决方案10】:
                <?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
            

            【讨论】:

            • 请解释你的代码块带来了什么。
            • 有两个循环,一个用于偶数索引,另一个用于奇数索引。正如您在输出中看到的那样,它将首先打印原始数组,然后是第一个循环的偶数数组,然后是第二个数组的奇数数组。所以数组被分成了两部分,偶数和奇数。
            • 我的意思是,将其解释为答案的补充。
            • 我同意。此答案缺少教育解释。
            猜你喜欢
            • 2015-01-28
            • 2013-10-09
            • 2011-12-28
            • 1970-01-01
            • 2022-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多