2012-09-13 117 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));