2016-09-02 4 views
1

У меня есть следующий массив:Может ли это быть возможной ошибкой php?

$arr_nav=array( 
    array("Jimmy", "B", "C", "A", "B", "D", "A", "B", "C", "A", "D", "C", "A", "B", "C", "A", "B", "A", "D", "B", "C", "A"), 
    array("John", "B", "", "", "A", "B", "C", "", "D", "", "", "", "", "", "", "", "", "", "", "", "", ""), 
    array("George", "B", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "") 
); 

Я хочу, чтобы проверить, есть ли 3 пустые ячейки в строке, в каждом и каждый из этих массивов.

В первой ячейке массива содержит имя студента, и следующие клетки являются те, которые должны быть определены, я написал эту функцию (которая начинается в ячейке 1 каждого массива):

public function checkEmptySpaces($arr){ 

    $emptyThree = false; //A variable to store the current condition of three spaces in a row or not 
    $emptyNames = array(); //Array of names, to return 

    //Start going over the two dimensional array 
    for($i=0; $i<count($arr); $i++){ 
     //Start from cell 1, and not 0, as cell 1 contains the name of the student, jump by 3 each time 
     for($j=1; $j<count($arr[0]); $j+=3){ 
      //Check whether the current cell, the one that comes after, and then one after both of them are all empty 
      if(($arr[$i][$j] == "") && ($arr[$i][$j+1] == "") && ($arr[$i][$j+2] == "")){ 
       //If yes, set $emptyThree to true 
       $emptyThree = true; 
      } 
     } 
     //Check if $emptyThree is set to true 
     if($emptyThree == true){ 
      //If yes, push the name of the array's student (as stored in it's first cell), in the $emptyNames array which we return in the end of the function 
      array_push($emptyNames, $arr[$i][0]); 
     } 
     //Reset the $emptyThree variable as the loops start going over the next array 
     $emptyThree = false; 
    } 
    //Return the new array which contains the names of the students that has 3 spaces in a row in their arrays 
    return $emptyNames; 
} 

Но это, похоже, не работает, кажется, что есть проблема с самим условием, потому что кажется, что он всегда возвращает true (оператор if), потому что он попадает в часть array_push, если нет 3 пустых ячеек в ряд.

Кто-нибудь, кто понимает, в чем проблема?

+1

Я бы ответил +1 на этот 100x, если бы мог, сначала сфотографировать код – zanderwar

+0

Почему вы делаете 2D-петли? Массивы, похоже, имеют только 1 размер ... – Damiano

+3

Назовите этот вопрос: Нет, это не ошибка PHP. – Simba

ответ

0

Ваши массивы имеют только одно измерение, поэтому вам не нужно вставлять второй цикл внутри этого. Я прав или что-то пропустил?

for($i=1; $i<count($arr)-2; $i++){ 
    if(($arr[$i][$j] == "") && ($arr[$i][$j+1] == "") && ($arr[$i][$j+2] == "")){ 
     $emptyThree = true; 
    } 
} 

EDIT:

Да я что-то пропустил - вы не открыть скобку в первой строке, так что у вас есть 2D массив. Затем, ваш код должен выглядеть следующим образом:

for($i=0; $i<count($arr); $i++){ 
    for($j=1; $j<count($arr[$i])-2; $j++){ 
     if(($arr[$j] == "") && ($arr[$j+1] == "") && ($arr[$j+2] == "")){ 
      $emptyThree = true; 
     } 
    } 
} 

Изменить 0 до $ я во второй строке, $ J + = 3 до $ j ++ и добавить -2 условию петли,

+0

Да, это была моя ошибка, это двухмерный массив. – StackMaster

+0

Дело в том, что я хочу прыгать каждый раз на 3 ячейки вперед ($ j + 3), так как я уже проверял два впереди. И я использую $ arr [i] [0], чтобы получить имя студента текущего массива. – StackMaster

+2

@StackMaster не звучит нормально, чтобы прыгать на 3 ячейки вперед. Переосмыслите прыгающую часть, потому что вы проверяете, есть ли последовательные пустые пространства каждые три ячейки. Например, ячейки 2,3 и 4 пусты, но вы проверили ячейки 1,2,3, а затем прыгнули на 4,5,6. –

2

Ошибок PHP не найдено.

Что:

  • Список студент представляет собой массив, где каждый элемент для одного студента.

  • Каждая запись студента представляет собой массив с первой записью в качестве имени, за которым следует список оценок.

  • Найти, если в массиве классов есть три последовательных пустых класса.

Как:

  • Имеют функцию (checkEmptySpaces), который принимает массив классов и возвращает позицию первого из трех последовательных пустых классов. Он возвращает -1, если нет трех последовательных пустых оценок.

  • вызов этой функции для каждого учащегося по очереди.

  • вывод: массив имя студента и положение первого из трех пустых классов.

Demonstration at eval.in

Код:

/** 
* Get start position of three empty cells 
* return -1 if all ok 
* 
* @param array $grades 
* 
* @return integer 
*/ 
function checkEmptySpaces($grades) 
{ 
    for ($pos = 0, $len = count($grades); $pos < $len - 2; $pos++) { 
     $emptyThree =  $grades[$pos] == "" 
         && $grades[$pos + 1] == "" 
         && $grades[$pos + 2] == ""; 

     if ($emptyThree) { 
      return $pos; 
     }    
    }  
    return -1; 
} 

запустить его:

$outThreeEmpty = array(); 

foreach ($arr_nav as $grades) { 

    $name = $grades[0]; // get name 
    $emptyPosition = checkEmptySpaces(array_slice($grades, 1)); 

    $outThreeEmpty[] = array($name => $emptyPosition); 
} 

var_dump($outThreeEmpty); 
exit; 

Результат:

array (size=4) 
    0 => 
    array (size=1) 
     'Jimmy' => int -1 
    1 => 
    array (size=1) 
     'John' => int 8 
    2 => 
    array (size=1) 
     'George' => int 1 
    3 => 
    array (size=1) 
     'onlyLast' => int 18 
Смежные вопросы