Php 按索引偶数或奇数将数组拆分为两个数组
我有这个阵列:Php 按索引偶数或奇数将数组拆分为两个数组,php,arrays,split,Php,Arrays,Split,我有这个阵列: $array = array(a, b, c, d, e, f, g); 我想根据索引是偶数还是奇数将其拆分为两个数组,如下所示: $odd = array(a, c, e, g); $even = array(b, d, f); 提前谢谢 我不确定这是否是最优雅的方式,但它应该具有魅力: $odd=array(); $even=array(); $count=1; foreach($array as $val) { if($count%2==1) {
$array = array(a, b, c, d, e, f, g);
我想根据索引是偶数还是奇数将其拆分为两个数组,如下所示:
$odd = array(a, c, e, g);
$even = array(b, d, f);
提前谢谢 我不确定这是否是最优雅的方式,但它应该具有魅力:
$odd=array();
$even=array();
$count=1;
foreach($array as $val)
{
if($count%2==1)
{
$odd[]=$val;
}
else
{
$even[]=$val;
}
$count++;
}
使用(PHP>=5.6):
只需在它们之间循环并检查键是偶数还是奇数:
$odd = array();
$even = array();
foreach( $array as $key => $value ) {
if( 0 === $key%2) { //Even
$even[] = $value;
}
else {
$odd[] = $value;
}
}
一种解决方案,使用匿名函数和: 这只需在数组的一次遍历中分离项目,但有点“聪明”。它实际上并不比经典的更冗长的版本好
$odd = array();
$even = array();
foreach ($array as $k => $v) {
if ($k % 2 == 0) {
$even[] = $v;
}
else {
$odd[] = $v;
}
}
一个
基于@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;
}
}
}
我获得了一个包含3个子数组(包括奇数/偶数类)的数组,使用Smarty语法:
{foreach$data.all as$article}…{/foreach}
{foreach$data.odd as$article}…{/foreach}
{foreach$data.偶为$article}…{/foreach}
希望它能帮助一些人…作为一个几乎一行的句子,我想这将是我最喜欢的:
$odd = [];
$even = [];
while (count($arr)) {
$odd[] = array_shift($arr);
$even[] = array_shift($arr);
}
$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;
使用数组\u块
:
$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\u列
:
$chunks = array_chunk( $array, 2 );
$even = array_column( $chunks, 0 );
$odd = array_column( $chunks, 1 );
对于较旧的PHP版本,情况类似。
按键将为0,2,4…和1,3,5,…。如果您不喜欢此操作,请也应用数组\u值
:
$even = array_intersect_key( $array, array_flip( range( 0, count( $array ), 2 )));
$odd = array_intersect_key( $array, array_flip( range( 1, count( $array ), 2 )));
或
输出:
原件:0123456789
偶数:02468
单数:13579
还有一个带有数组块和数组映射的功能解决方案。当源数组的大小为奇数时,最后一行从第二个数组中删除空项
list($odd, $even) = array_map(null, ...array_chunk($ar,2));
if(count($ar) % 2) array_pop($even);
b
、d
和f
的键是1
、3
和5
。。。您确定他们不应该是$odd
?请尽量避免将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。请编辑你的答案,包括不,我不是。你的答案太短了,以至于它落在了低质量的审查队列中。我的评论没有冒犯的意思,你的回答也没有错,这就是为什么我投票不删除它,但对你所做的做一个基本的解释将是有用的。一句简单的话将使你的答案质量加倍,这将有助于未来的新用户,并提高你获得+1的几率。这是一个双赢的局面。我是一个简单的人。我不需要投票。我绝对不在乎“质量审查”算法“认为”我应该做什么。@DoubleThink,我觉得是的。但我们希望,每一个经过充分解释的答案,即使是微不足道的,都能学到一个学徒式的更干净的代码。允许代码大师在代码输出过程中获得更多不间断的时刻,从而改变世界。;)请解释您的代码块给表带来了什么。有两个循环,一个用于偶数索引,另一个用于奇数索引。正如您在输出中看到的,它将首先打印原始数组,然后按第一个循环打印偶数数组,然后按第二个数组打印奇数数组。所以数组被分为两部分,偶数和奇数。我的意思是,把它解释为对答案的补充。我同意。这个答案缺少教育性的解释。我已经寻找了一些优雅的解决方案,但最终得到了一个简单而冗长的解决方案。它更易于理解和维护。不幸的是,这种技术将在输入数组上进行两次完整的传递。这个缺点并没有出现在公认的答案中——Jon的两个解决方案都只对输入数组进行了一次遍历。我喜欢您的array\u chunk()
和array\u column()
示例,非常清晰。它不需要偶数个元素。谢谢。我不知道我是否还能想出这些解决办法
$even = $odd = array();
foreach( array_chunk( $array, 2 ) as $chunk )
list( $even[], $odd[] ) = $chunk;
$chunks = array_chunk( $array, 2 );
$even = array_column( $chunks, 0 );
$odd = array_column( $chunks, 1 );
$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 ));
<?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
list($odd, $even) = array_map(null, ...array_chunk($ar,2));
if(count($ar) % 2) array_pop($even);