2016-09-02 19 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

コードを実質的に難読化する必要がある場合は、この100倍の回答を+1します – zanderwar

+0

なぜ2Dループを作成しますか?配列は1次元しかないようです... – Damiano

+3

Re:この質問のタイトル:いいえこれはPHPのバグではありません。 – Simba

答えて

0

配列には1次元しかないので、この配列内に2番目のループをネストする必要はありません。私は右か何かを逃したのですか?

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

EDIT

うん、私は何かを逃した - あなたは、最初の行にブレースを開いていなかったので、あなたは、2次元配列を持っていますか。その後、のようになりますあなたのコードは次のとおりです。

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 2行目の$ Iに、$ jの+ = 3 $ jの++に変更し、ループ条件に-2を追加し、

+0

はい、それは私の間違いでした。それは約2次元配列です。 – StackMaster

+0

事は、私は3つのセルを前進させる($ j + 3)たびに飛びたいと思っています。現在の配列の学生名を取得するために$ arr [i] [0]を使用します。 – StackMaster

+2

@StackMaster 3つのセルを先に飛び越えてもいいとは思わない。 3つのセルごとに連続する空白があるかどうかをチェックするので、ジャンプする部分を再考してください。たとえば、セル2,3および4は空ですが、セル1,2,3を確認してから4,5,6でジャンプしました。 –

2

PHPのバグは見つかりませんでした。

は何:

  • 生徒のリストには、各エントリは一人の学生のためである配列です。

  • 各生徒のエントリは、最初のエントリと名前の後にグレードのリストが続く配列です。

  • グレードの配列に3つの連続した空のグレードがあるかどうかを調べます。

方法:

  • はグレードの配列を受け取り、三つの連続空の等級の最初の位置を返す関数(checkEmptySpaces)を持っています。空白の連続した3つの等級がない場合は-1を返します。

  • この関数を各生徒に順番に呼び出します。

  • 出力:学生名の配列と3つの空白のグレードの位置。

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