поиск php массив внутри цикла - PullRequest
2 голосов
/ 22 декабря 2011

Предположим, у меня есть следующий массив $diff.

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 times в его последовательности и is not an Array (instead 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;
            }
        }
    }
}

?>

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

ОБНОВЛЕНО согласно комментарию @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

Смотрите, как работает

1 голос
/ 22 декабря 2011

Все, что вам нужно, это счетчик, который подсчитывает последовательные значения, не являющиеся массивами.Увеличивайте его с каждым значением массива и сбрасывайте с каждым не массивным значением:

$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 голосов
/ 22 декабря 2011

может быть:

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...