2016-03-13 6 views
0

У меня есть массив, который связан с текстовым файлом, в котором мне нужна информация о имени студента и номере студента, введенном пользователем.Поиск того же значения в php-массиве

if (isset ($_POST['stnum']) && isset ($_POST['stname'])) 
    { 
     $studentNum = htmlentities ($_POST['stnum']); 
     $studentName = htmlentities ($_POST['stname']); 
     $DB = fopen ($students, 'r') or die ("$students cannot be opened for reading."); 

     while ($record = fgets ($DB) and ! $foundNum and ! $foundName) 
     { 
      $studentField = explode ("$$", htmlentities (trim ($record))); 

      $foundNum = $studentNum === $studentField[0]; 
      $foundName = $studentName === $studentField[1]; 
     } 

     fclose ($DB); 

     if ($foundNum && $foundName) 
     { 
      echo $studentField[0], $studentField[1]; 
     } 
    } 

Я не могу понять, как искать студентов с таким же именем, но с другим номером ученика. И файл записывается как этот

DA-708-3304$$Elizabeth Organ 
GB-217-1214$$John Alexander 
SE-412-2175$$Odell Thomas 
SH-433-3012$$John Saunders 
HU-737-1176$$Frederica Elias 
DU-941-4244$$Nancy Sauceda 
CC-671-5984$$Margaret Coppa 
DA-220-7070$$Walter Snyder 
HU-658-4475$$Elizabeth Organ 
DU-255-9787$$John Saunders 
CC-777-8752$$Hubert Green 

Например, если я пытаюсь искать для John Saunders с студенческим номером DU-255-9787 это не работает, но John SaundersSH-433-3012 делает, потому что он появляется первым в файле.

+0

Не ответ, но у вас есть повторяющаяся строка перед блоком while: «$ studentField = explode (« $$ », htmlentities (trim ($ record))); –

+0

Да, я заметил, что всего через пару минут после публикации, спасибо за это, хотя – user3316257

+0

Google за «вернуть все похожие записи массива» ... http://stackoverflow.com/questions/19966490/find-all-array- keys-that-have-same-value – Daniel

ответ

2

Почему бы не использовать разрыв в условии if? Когда условие удовлетворяет?

while ($record = fgets ($DB) and ! $foundNum and ! $foundName) { 
    $studentField = explode ("$$", htmlentities (trim ($record))); 

    if (($studentName === $studentField[1]) && empty($studentNum))) { 

      /* When only name is entered by user. So, the user whose number appears first in the list should be printed. */ 

     echo $studentField[1].", ".$studentField[0]; 
     break; 

    } else if (($studentNum === $studentField[0]) && ($studentName === $studentField[1])) { 

     /* When both name and number is entered by user */ 

     echo $studentField[1].", ".$studentField[0]; 
     break; 
     } 


    } 

Надеюсь, это поможет.

Мир! xD

+0

Использование инструкции break в цикле обеспечивает большую гибкость в вашем коде, поскольку вы хотите получить только первый результат поиска. –

+0

Это не отвечает на его вопрос ... Он не решает проблему. –

+0

Да, да. Вы можете поближе взглянуть, прежде чем перейти к выводам, приятель. :) –

Смежные вопросы