2011-12-22 17 views
2

私は以下の配列を持っているとします$diffループ内部のPHP検索配列

a, a, a, a, b, b, b, a, a, b, b, b, a, a, a, b 

A represents a value inside $diff. 
B represents an Array inside $diff. 

今私はそれがその配列とis not an Arrayinstead a value)でmore than two timesを発生した場合Aをカウントする必要があります。それ以外の場合は無視してください。

上記の入力のために、私の試みである。ここ

[a] = not an array; 0 
[a,a] = not an array; 0 
[a,a,a] = not an array; 3 
[a,a,a,a] = not an array; 4 
[b] = array; 
[b,b] = array; 
[b,b,b] = array; 
[a] = not an array; 0 
[a,a] = not an array; 0 
[b] = array; 
[b,b] = array; 
[b,b,b] = array; 
[a] = not an array; 0 
[a,a] = not an array; 0 
[a,a,a] = not an array; 3 
[b] = array; 

を次のようにコードが機能しなければならないが、値が置換されますので、値が変更されます!動作しません。

<?php 

foreach($diff as $key => $val) { 

    if (!is_array($diff[$key])) { // THIS MEANS THAT THE CURRENT ELEMENT IS NOT AN ARRAY. 
     if(is_array($diff[$key-1])) { //START OF SEQ. IF THE PREVIOUS ELEMENT IS AN ARRAY AND CURRENT ELEMENT IS NOT AN ARRAY. 

     $SEQ_START=$key; 
     $n=1; 

      for($i=0; $i<=count($diff); $i+=1) { // I AM CHECKING HERE IF THE NEXT 3 ELEMENTS are NOT ARRAY, HENCE I CAN INCREMENT IT 

      if(!is_array($diff[$SEQ_START+$i])) $n+=1; 
      else $n=0; 
      } 
     } 
    } 
} 

?> 
+0

私はカウントの論理を理解していますが、最終結果は何ですか?連続セグメントの数(> 2)、または連続セグメントの要素数(> 2)? (e。もし前者なら答えは2、後者なら答えは7) – Grexis

+0

私は上記の例で答えが7である必要があります。 – SupaOden

答えて

2

UPDATED以下

$diff = array(array(),'a', 'a', 'a', 'a', array(), array(), array(), 'a', 'a', array(), array(), array(), 'a', 'a', 'a', array()); 

// Counter to hold current sequence total 
$count = 0; 
// Array to hold results 
$counted = array(); 

// Loop array 
foreach ($diff as $key => $val) { 
    if (is_array($val)) { // If it is an array 
    if ($count > 2) { // If the counter is more than 2 
     $counted[(isset($seq)) ? $seq + 1 : 0] = $count; // add it to the array 
    } 
    // Reset the counter 
    $count = 0; 
    $seq = $key; 
    } else { 
    // Increment the counter 
    $count++; 
    } 
} 
// If there is a >2 counter at the end, add one more result 
if ($count > 2) { 
    $counted[(isset($seq)) ? $seq + 1 : 0] = $count; 
} 

print_r($counted); 
// Outputs: 
// Array 
// (
//  [0] => 4 
//  [12] => 3 
//) 

// or if you want the total count 
$total = array_sum($counted); 
echo $total; // 7 

See it working

+0

これは不要ですが、foreachにインデックスを含めると、シーケンスの開始のインデックスを$ countedのインデックスとして格納できます。 10行目と$ counted [count($ diff) - $ count] = $ count; '行21の' $ counted [$ index- $ count] = $ count; 'のようなもの – Grexis

+0

@Grexis私はコードをどのように私はそれを行うだろう: - D – DaveRandom

+0

あなたの実装は間違いなくもっときれいになるだろう... showoff:p – Grexis

1

すべての必要なのは、連続した配列以外の値をカウントするカウンタです。すべての配列値でそれを増やして、すべての非配列値でそれをリセットします。

$seqLength = 0; 
foreach ($arr as $index => $value) { 
    if (is_array($value)) { 
     $seqLength++; 
     echo 'array'; 
    } else { 
     $seqLength = 0; 
     echo 'not an array'; 
    } 
    if ($seqLength > 2) { 
     echo '; '.$seqLength; 
    } else { 
     echo '; 0'; 
    } 
} 
0

多分:

$a = array(1,1,1,1,1,array(1,1),1,1,1,1,1,array(1,1)); 
$i = 0; 
$j = 0; 
foreach ($a as $item){ 
    if ($i>=2){ 
     $j=$i + 1; 
    } 
    if (!is_array($item)){ 
     $i++; 
     echo $j.'<br>'; 
    }else{ 
     $i=0; 
     $j=0; 
     echo '<br>'; 
    } 
} 

出力:@Grexis'はコメントどおり

0 
0 
3 
4 
5 

0 
0 
3 
4 
5