我有這樣的陣列:拆分陣列成兩個陣列由索引的偶數或奇數
$array = array(a, b, c, d, e, f, g);
我想它在根據兩個陣列分割如果索引是偶數還是奇數,如下所示:
$odd = array(a, c, e, g);
$even = array(b, d, f);
提前致謝!
我有這樣的陣列:拆分陣列成兩個陣列由索引的偶數或奇數
$array = array(a, b, c, d, e, f, g);
我想它在根據兩個陣列分割如果索引是偶數還是奇數,如下所示:
$odd = array(a, c, e, g);
$even = array(b, d, f);
提前致謝!
的一個解決方案,使用匿名功能和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;
}
}
我不知道這是否是最優雅的方式,但它應該工作魅力:
$odd=array();
$even=array();
$count=1;
foreach($array as $val)
{
if($count%2==1)
{
$odd[]=$val;
}
else
{
$even[]=$val;
}
$count++;
}
使用array_filter
:
$odd=array_filter($array, function ($input) {return $input & 1;});
$even=array_filter($array, function ($input) {return !($input & 1);});
只是循環,雖然他們並檢查重點是偶數或奇數:
$odd = array();
$even = array();
foreach($array as $key => $value) {
if(0 === $key%2) { //Even
$even[] = $value;
}
else {
$odd[] = $value;
}
}
一個
$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];
}
}
基於@喬恩的第二個變體,我取得了較好的這個以下與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.even as $article}...{/foreach}
希望它可以幫助一些人...
$odd = [];
$even = [];
while (count($arr)) {
$odd[] = array_shift($arr);
$even[] = array_shift($arr);
}
請儘量避免將代碼轉儲爲答案,並嘗試解釋它的作用和原因。對於那些沒有相關編碼經驗的人來說,你的代碼可能並不明顯。請編輯你的答案,包括[澄清,上下文,並嘗試在你的答案中提及任何限制,假設或簡化。](https://stackoverflow.com/help/how-to-answer) – Frits
你在開玩笑吧? – DoubleThink
不,我不是。您的回答太短,以致於它落在_Low質量評審隊列_中。我的評論沒有冒犯意味,你的回答也沒有錯,這就是爲什麼我投票不要刪除它,但對你正在做什麼的基本解釋是有用的。一個簡單的句子會使答案的質量翻倍,這有助於未來的新用戶,並提高+1的機會。這是一個雙贏的局面。 – Frits
作爲一個幾乎一個內膽,我認爲這將是我最喜歡的:
$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));
的鍵'B','D'和'F'是'1','3'和'5' ...你確定他們不應該是'$奇怪'嗎? – Krycke