21

私はこの配列を持っています:

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

次のように、インデックスが偶数か奇数かに応じて2つの配列に分割します。

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

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

前もって感謝します!

4

10 に答える 10

43

1つの解決策、無名関数とarray_walk:を使用する

$odd = array();
$even = array();
$both = array(&$even, &$odd);
array_walk($array, function($v, $k) use ($both) { $both[$k % 2][] = $v; });

これにより、配列を1回通過するだけでアイテムが分離されますが、少し「賢い」側になります。これは、古典的でより冗長なものよりも実際には優れていません

$odd = array();
$even = array();
foreach ($array as $k => $v) {
    if ($k % 2 == 0) {
        $even[] = $v;
    }
    else {
        $odd[] = $v;
    }
}
于 2012-09-13T11:35:36.693 に答える
13

使用array_filter(PHP> = 5.6):

$odd = array_filter($array, function ($input) {return $input & 1;}, ARRAY_FILTER_USE_KEY);
$even = array_filter($array, function ($input) {return !($input & 1);}, ARRAY_FILTER_USE_KEY);
于 2012-09-13T11:34:50.323 に答える
5

これが最もエレガントな方法かどうかはわかりませんが、魅力的に機能するはずです。

$odd=array();
$even=array();
$count=1;
foreach($array as $val)
{
    if($count%2==1)
    {
        $odd[]=$val;
    }
    else
    {
        $even[]=$val;
    }
    $count++;
}
于 2012-09-13T11:34:04.397 に答える
4

ほぼワンライナーとして、これが私のお気に入りになると思います。

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

$ arrayが偶数の要素を持つことが保証されている場合:

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

PHP 5.5.0+とarray_column

$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 ));
于 2018-01-06T12:09:09.450 に答える
2

array_chunkとarray_mapを使用したもう1つの機能ソリューション。ソース配列のサイズが奇数の場合、最後の行は2番目の配列から空のアイテムを削除します

list($odd, $even) = array_map(null, ...array_chunk($ar,2));
if(count($ar) % 2) array_pop($even);
于 2019-07-16T11:42:00.823 に答える
1

それらをループして、キーが偶数か奇数かを確認してください。

$odd = array();
$even = array();
foreach( $array as $key => $value ) {
    if( 0 === $key%2) { //Even
        $even[] = $value;
    }
    else {
        $odd[] = $value;
    }
}
于 2012-09-13T11:35:31.010 に答える
1

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];
    }
}
于 2012-09-13T11:36:19.597 に答える
1

@Jonの2番目のバリアントに基づいて、PHPSmartyv3テンプレートエンジンで使用するために次のように作成しました。これは、1列または2列のテンプレートモデルの両方でニュース/ブログを表示するためのものです。

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

Smartyの使用構文を使用して、3つのサブ配列(奇数/偶数クラスを含む)の配列を取得します。

  1. 全てのアイテム{foreach $data.all as $article}...{/foreach}
  2. 奇数アイテムのみ{foreach $data.odd as $article}...{/foreach}
  3. アイテムのみ{foreach $data.even as $article}...{/foreach}

それが何人かの人々に役立つことを願っています...

于 2017-01-31T07:24:57.450 に答える
1
$odd = [];
$even = [];
while (count($arr)) {
    $odd[] = array_shift($arr);
    $even[] = array_shift($arr);
}
于 2017-06-29T14:00:39.940 に答える
0
    <?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
于 2019-03-26T16:00:00.477 に答える