【问题标题】:PHP array with a nested foreach带有嵌套 foreach 的 PHP 数组
【发布时间】:2016-04-17 07:15:21
【问题描述】:

我有一个包含 sql 数据的表。 db 中的某些列的名称超过 1 个。我已经从它们创建了一个数组,但现在我需要在创建表时比较两者。

$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>";
 }

当我运行此代码时,我让学生的成绩与数组中的名字相匹配,但随后其他成绩继续尝试与第一个学生相匹配,即使有一个新行有一个新的姓名。

任何帮助都会很棒!谢谢!

【问题讨论】:

  • var_dump ($strArrayChildren) 在第 4 行,var_dump ($strArrayGrades) 在第 7 行。你有什么?
  • for 'var_dump ($strArrayChildren)' 我得到以下一堆:array(3) { [0]=> string(5) "Becky" [1]=> string(6) " Aaron" [2]=> string(6) " Luke" } for var_dump ($strArrayGrades) 我得到以下一堆:array(3) { [0]=> string(6) "Olivia" [1] => 字符串(5)“艾伦”[2]=>字符串(6)“杰克”}
  • 在这些数组中看不到任何成绩信息。而且,这两者之间似乎没有任何关系!
  • 抱歉一年级是这个,array(2) { [0]=> string(7) "1 Becky" [1]=> string(9) "11 Aaron" } array(1 ) { [0]=> string(11) "12 Gertrude" } array(1) { [0]=> string(7) "6 Laura" } array(1) { [0]=> string(7) " 1 苏珊” } 数组(1) { [0]=> 字符串(9)“11 克里” } 数组(2) { [0]=> 字符串(8)“2 奥利维亚” [1]=> 字符串(7) " 2 Alan" } array(1) { [0]=> string(8) "3 Claire" } array(1) { [0]=> string(8) "1 Claire" } 不知道为什么它没有显示最后一个的等级。这些名称是我要匹配的关系。

标签: php mysql arrays foreach


【解决方案1】:

我不确定您的数据库,但这应该可以。我正在使用静态数组发布响应。

<?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() 中修剪针;在某些情况下存在不需要的空白。最好在循环开始时修剪空白

【讨论】:

  • 我将代码复制到我的编辑器中,您编写的内容很好。当名称在第一个匹配时,它仅从第二个数组中提取。但是当我编辑我的代码以匹配时,我仍然遇到同样的问题。它只会拉取成绩数组中的名字,然后移动到下一行并在那里拉取名字,依此类推。数据来自 sql db,每一列的成绩看起来像这样 9 (Susan), 5 (Luke)。我使用爆炸将它变成一个数组。有没有办法为此修改您的代码?
  • 编辑了我的答案,包括您发送的查询响应示例。
  • 太棒了!做到了,非常感谢,我已经为此工作了一段时间。
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多