2012-09-13 69 views
9

我有这样的阵列:拆分阵列成两个阵列由索引的偶数或奇数

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

我想它在根据两个阵列分割如果索引是偶数还是奇数,如下所示:

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

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

提前致谢!

+0

的键'B','D'和'F'是'1','3'和'5' ...你确定他们不应该是'$奇怪'吗? – Krycke

回答

27

的一个解决方案,使用匿名功能和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; 
    } 
} 
3

我不知道这是否是最优雅的方式,但它应该工作魅力:

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

使用array_filter

$odd=array_filter($array, function ($input) {return $input & 1;}); 
$even=array_filter($array, function ($input) {return !($input & 1);}); 
+1

我猜'array_filter'对数值有效,而不是键 –

+0

@ClydeLobo啊。太快回答问题而不正确地阅读问题。 – Gareth

+2

有趣的是,从PHP 5.6开始,如果您将'ARRAY_FILTER_USE_KEY'传递给可选的第三个参数,您可以通过键而不是值使用'array_filter'。 – Gareth

1

只是循环,虽然他们并检查重点是偶数或奇数:

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

一个

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

基于@乔恩的第二个变体,我取得了较好的这个以下与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的语法:

  1. 所有项目{foreach $data.all as $article}...{/foreach}
  2. 奇品只{foreach $data.odd as $article}...{/foreach}
  3. 甚至项仅{foreach $data.even as $article}...{/foreach}

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

1
$odd = []; 
$even = []; 
while (count($arr)) { 
    $odd[] = array_shift($arr); 
    $even[] = array_shift($arr); 
} 
+0

请尽量避免将代码转储为答案,并尝试解释它的作用和原因。对于那些没有相关编码经验的人来说,你的代码可能并不明显。请编辑你的答案,包括[澄清,上下文,并尝试在你的答案中提及任何限制,假设或简化。](https://stackoverflow.com/help/how-to-answer) – Frits

+0

你在开玩笑吧? – DoubleThink

+0

不,我不是。您的回答太短,以致于它落在_Low质量评审队列_中。我的评论没有冒犯意味,你的回答也没有错,这就是为什么我投票不要删除它,但对你正在做什么的基本解释是有用的。一个简单的句子会使答案的质量翻倍,这有助于未来的新用户,并提高+1的机会。这是一个双赢的局面。 – Frits

0

作为一个几乎一个内胆,我认为这将是我最喜欢的:

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

如果$阵列保证具有偶数个元素的:

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

带有的PHP 5.5.:

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