2016-04-17 3 views
0

У меня есть таблица с данными из sql. Некоторые столбцы в db имеют более одного имени. Я создал массив из них, но теперь мне нужно сравнить их при создании таблицы.PHP-массив с вложенным foreach

$strArrayChildren = explode(',', $children); 
$strArrayChildren = str_replace('and', '', $strArrayChildren); 
$childCount = count($strArrayChildren); 

$strArrayGrades = explode(',',$the_grades); 
$strArrayGrades = str_replace('(', '', $strArrayGrades); 
$strArrayGrades = str_replace(')', '', $strArrayGrades); 

$grades =''; 
foreach($strArrayChildren as $child){ 
    foreach($strArrayGrades as $grade){ 
     if(strpos($grade, $child) !== false){ 
      $grades = preg_replace('([a-z A-Z()]+)', "", $grade); 
     }elseif(strpos($grade, $child) !== true){ 
      $grades =''; 
     } 
    } 
    echo "<tr>"; 
     echo "<td>{$child}</td>"; 
     echo "<td>{$last_name}</td>"; 
     echo "<td>Child</td>"; 
     echo "<td>{$grades}</td>"; 
    echo "</tr>"; 
} 

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

Любая помощь будет замечательной! Спасибо!

+1

'var_dump ($ strArrayChildren)' в строке 4 и 'var_dump ($ strArrayGrades)' в строке 7. Что у вас есть? –

+0

для 'var_dump ($ strArrayChildren)' Я получаю кучу следующего: array (3) {[0] => string (5) "Becky" [1] => string (6) "Aaron" [2] = > string (6) «Luke»} для var_dump ($ strArrayGrades) Я получаю кучу следующего: array (3) {[0] => string (6) "Olivia" [1] => string (5) " Alan "[2] => string (6)« Jack »} – JonW

+0

Невозможно просмотреть информацию о классе в этих массивах. Кроме того, там не должно быть никаких отношений между этими двумя! –

ответ

0

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

<?php 
$strArrayChildren = array("Becky"," Aaron"," Luke"); 
$the_grades = "9 (Susan), 5 (Luke)"; 
$strArrayGrades = explode(',',$the_grades); 
echo "<html><body><table style='text-align: center; width: 400px;'>"; 
echo "<tr>"; 
      echo "<td>Child</td>"; 
      echo "<td>Grade</td>"; 
     echo "</tr>"; 
foreach($strArrayChildren as $child){ 
    $grades = ""; 
    $child = trim($child); 
    foreach($strArrayGrades as $key => $grade){ 
     if(strpos($grade, $child) > 0){ 
      $grades = intval(preg_replace('/[^0-9]+/', '', $grade), 10); 
     } 
    } 
    echo "<tr>"; 
     echo "<td>{$child}</td>"; 
     echo "<td>{$grades}</td>"; 
    echo "</tr>"; 
} 
echo "</table></body></html>"; 
?> 

Объяснение:

  1. вам необходимо инициализировать $grades сразу после первого цикла запуска
  2. Там нет смысла тестировать оба состояния strpos() функции
  3. Это безопасно, чтобы проверить положение иглы в струне (быть терке чем 0)
  4. Вам нужно изменить регулярное выражение для выбора чисел из строки.
  5. Игла для обрезки в strpos(); в некоторых случаях есть нежелательное пустое пространство. Лучше обрезать белые пробелы в начале цикла
+0

Я скопировал код в свой редактор, и то, что вы написали, работает хорошо. Он только вытащил из второго массива, когда имя совпало в первом. Но когда я редактирую свой код для соответствия, я получаю ту же проблему, что и у меня. Он будет вытаскивать только первое имя в массиве оценки, а затем переходить к следующей строке и вытаскивать там первое имя и т. Д. Данные поступают из sql db, и каждый столбец оценок выглядит следующим образом 9 (Сьюзан), 5 (Luke). Я использую взрыв, чтобы превратить его в массив. Есть ли способ изменить код для этого? – JonW

+0

Отредактировал мой ответ, включая образец ответа на запрос, который вы отправили. –

+0

Удивительный! Это сделало это, большое вам спасибо, я уже некоторое время работаю над этим. – JonW