2011-12-22 89 views
2

假设我有以下数组$diffPHP搜索数组内循环

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. 

现在我都数不过来A,如果它发生在其序列more than two timesis not an Arrayinstead a value)。否则,无视它。

对于上面的输入,代码应该具有如下功能

[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)? (如果前者,答案是2,如果后者,答案是7) – Grexis 2011-12-22 10:06:58

+0

我需要在上面的例子中答案是7。 – SupaOden 2011-12-22 10:12:57

回答

2

修订按照@Grexis'注释低于

$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中包含索引,则可以将序列开头的索引作为索引存储在$ count中。类似于'$ count [$ index- $ count] = $ count;'在第10行和'$ counts [count($ diff) - $ count] = $ count;'在线21 – Grexis 2011-12-22 10:20:37

+0

@Grexis我更新了代码我会怎么做:-D – DaveRandom 2011-12-22 10:26:42

+0

不会说谎,你的实现绝对是整洁的... showoff:p – Grexis 2011-12-22 10:35:38

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

输出:

0 
0 
3 
4 
5 

0 
0 
3 
4 
5