2012-01-08 2 views
2

アレイを2つに分割するのに問題があります。私の配列を奇数/偶数の数字キーで分割すると、何がうまくやっていますか?

function odd($var){return($var & 1);} 
function even($var){return(!($var & 1));} 


$odd = array_filter($vb, "odd"); 
$even = array_filter($vb, "even"); 

私はthoses 2つの配列抱えている:やった

Array 
(
    [0] => 2011-12-26 
    [1] => 2011-12-27 
    [2] => 2011-12-28 
    [3] => 2011-12-29 
    [4] => 2011-12-30 
    [5] => 2011-12-31 
    [6] => 2012-01-01 
    [7] => livree 
    [8] => livree 
    [9] => en_cours 
    [10] => en_cours 
    [11] => en_cours 
    [12] => en_cours 
    [13] => en_cours 
) 



Array 
(
    [0] => livree 
    [1] => livree 
    [2] => livree 
    [3] => livree 
    [4] => livree 
    [5] => livree 
    [6] => livree 
    [7] => 2012-01-02 
    [8] => 2012-01-03 
    [9] => 2012-01-04 
    [10] => 2012-01-05 
    [11] => 2012-01-06 
    [12] => 2012-01-07 
    [13] => 2012-01-08 
) 

を私は奇数/偶数キーを検出するためにこれらの機能を使用し、2貴様配列にそれを分割

Array 
(
    [0] => livree 
    [1] => 2011-12-26 
    [2] => livree 
    [3] => 2011-12-27 
    [4] => livree 
    [5] => 2011-12-28 
    [6] => livree 
    [7] => 2011-12-29 
    [8] => livree 
    [9] => 2011-12-30 
    [10] => livree 
    [11] => 2011-12-31 
    [12] => livree 
    [13] => 2012-01-01 
    [14] => livree 
    [15] => 2012-01-02 
    [16] => livree 
    [17] => 2012-01-03 
    [18] => en_cours 
    [19] => 2012-01-04 
    [20] => en_cours 
    [21] => 2012-01-05 
    [22] => en_cours 
    [23] => 2012-01-06 
    [24] => en_cours 
    [25] => 2012-01-07 
    [26] => en_cours 
    [27] => 2012-01-08 
) 

私は間違っていますか? Thxあなたの助けに!それ

+2

を[ 'array_filter'](http://php.net/ar ray_filter)はキーではなく値で動作します。あなたは他のものを試す必要があります。http://www.php.net/ref.arrayとhttp://www.php.net/array – hakre

+1

をご覧ください。http://stackoverflow.com/questions/738168/ filter-array-odd-even –

+0

あなたの例の配列とコードは、あなたが示した2つの配列を生成しません。 – salathe

答えて

6

array_filterは、キーではなく値を渡します。私はあなたが正確にこれらの結果を得ている理由を理解することはできないが、いずれにせよ、あなたは全くarray_filter必要はありません。それを行うには

より高速な方法を:それを行うには

$odd = $even = array(); 
for ($i = 0, $l = count($vb); $i < $l;) { // Notice how we increment $i each time we use it below, by two in total 
    $even[] = $vb[$i++]; 
    $odd[] = $vb[$i++]; 
} 

キュートな方法:

foreach (array_chunk($vb, 2) as $chunk) { 
    $even[] = $chunk[0]; 
    $odd[] = $chunk[1]; 
} 

...といくつかの理由のために私はまた、あなたが本当に連想配列たかったと思う:

foreach (array_chunk($vb, 2) as $chunk) { 
    $days[$chunk[1]] = $chunk[0]; 
} 
+0

あなた、私の友人、ロック!ありがとうございました! – knibals

0
function is_odd($num) 
{ 

    if ($num % 2 == 0) 
     return false; 
    else  
     return true; 
} 

$even_array=array(); 
$odd_rray=array(); 

foreach($array as $key=>$val) 
{ 
    if(is_odd($key)) 
     array_push($odd_array,$val) 
    else 
     array_push($even_array,$val) 
} 

print_r($even_array); 
print_r($odd_array); 
1
for($i = 0; $i < sizeof($yourarray); $i = $i+2) { 
    $even[] = $yourarray[$i]; 
    $odd[] = $yourarray[$i+1]; 
} 
// See if the array is having even no. of elements for example if it would be having 28 elements instead of 27 then we will miss the 28th element in the loop. So we have to check that and add it to the even array. 

if((sizeof($yourarray) % 2) == 0) 
    $even[] = $yourarray[sizeof($yourarray-1)];  

ザッツ!

-1

私はPHPとの良好ではないけど、ここで私はC#(およびLINQを使用せず)にどうなるのかです:

LINQを使用して
object[] input = new object{ 
    "livee", new DateTime(2012,1,1), 
    "livee", new DateTime(2012,1,2), 
    "livee", new DateTime(2012,1,3), 
    "livee", new DateTime(2012,1,4)}; 

ArrayList stringValues = new ArrayList(); 
ArrayList dateValues = new ArrayList(); 

for(int i = 0; i< input.Length; i ++) 
{ 
    if(i % 2 == 0) 
    stringValues.Add(input[i]); 
    else 
    dateValues.Add(input[i]); 
} 

C#で、次が可能です:

また
string[] stringValues = input.OfType<string>().ToArray(); 
DateTime[] dateValues = input.OfType<DateTime>().ToArray(); 

たとえば、のようないくつかのPHP実装があります。。

+0

助けようとするといいですね。私は@sad_dudeソリューションを保持しています。再び、merci beaucoup! :) – knibals

関連する問題