我有这样的阵列:拆分阵列成两个阵列由索引的偶数或奇数
$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