【问题标题】:PHP nested loop behaving unexpectedlyPHP 嵌套循环行为异常
【发布时间】:2010-10-12 13:06:06
【问题描述】:

我有一个数组,其中包含特定文章 ($link_cat) 的类别。然后,我使用 mysql_fetch_array 将 all 可用的类别打印到带有复选框的列表中。在执行此操作时,我希望它将其所在的值与另一个数组中的值进行比较。如果匹配,则表示其中一个类别适用于这篇文章,它应该打印出一行代码来应用选中的属性。伟大的!除了它不工作=[

    while ( $row = mysqli_fetch_array($results, MYSQLI_ASSOC) ){
    $cat[$i] = $row['category'];
    $cat_id[$i] = $row['cat_id'];

    echo '<li><input type="checkbox" ';

    $catCount = count($link_cat);
    for ($ct = 0; $ct < $catCount; $ct++){
        if ($cat_id[$i] == $link_cat[$ct]){ 
            echo 'checked="checked" ';
        }
    }

    echo 'name="' . $cat_id[$i] . '" />' . $cat[$i] . '</li>';

    $i++;
}

我以前从未真正做过嵌套循环(我怀疑这就是问题所在)。

问题似乎是,当它运行时,将在其中检查第一个类别的 $link_cat[0] - 没有注册。它出现空白。在 for 循环中打印出变量证实了这一点。任何其他 [1] [2] 等都可以。它只是 [0]。但为什么?这似乎没有任何意义。我知道里面有东西,因为我在填充数组时打印了它的内容,只是为了检查。然而,它不仅仅在循环期间显示。有什么想法吗?

【问题讨论】:

  • 你能显示填充$link_cat的代码吗?
  • 同意,这似乎更有可能是问题所在。
  • 你在进入while循环之前是否将$i初始化为零?
  • 1) 你能显示 var_dump($row) 在 while() 循环中至少显示一行的内容吗? 2) $i 是某个未初始化的地方。可能是个问题。 3) for() 循环极其无效。至少应该休息一下;找到匹配类别后的 if() 语句!
  • 4) 同样,除非您将其作为某些学校项目的一部分,否则我敢打赌使用一些自动处理此级别内容的框架更有意义。

标签: php mysql loops nested-loops


【解决方案1】:

轻微的错误修复(以及明显的样式更改):您的版本可以打印出checked="checked" 多次。 $cat$cat_id 需要是数组吗?

while ( $row = mysqli_fetch_array($results, MYSQLI_ASSOC) ) {
    $cat = $row['category'];
    $cat_id = $row['cat_id'];

    echo '<li><input type="checkbox" ';
    if ( in_array($cat_id, $link_cat) ) {
        echo 'checked="checked" ';
    }
    echo "name='$cat_id' />$cat</li>";
}

对于通常会在问题上抛出调试器的情况,我喜欢在评论块中输入一个漂亮的print_r(查看源代码以获取调试输出,在实时站点上更安全)。

echo '<!-- ' . print_r($link_cat, TRUE) . ' -->';

【讨论】:

  • 感谢朋友,非常感谢。你的方法好多了,我正在学习:)
【解决方案2】:

虽然我最初对需要重置的数组循环非常错误,但我无法摆脱这样一种感觉,即循环遍历该数组并不是完成您所追求的最快方法。

也许array_search 可以,或者array_key_existsin_array 看起来像个赢家,但我没想到

【讨论】:

  • 他是按索引访问的,reset()是不必要的。
  • 我明白了。我将删除我的回复中的愚蠢部分。
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2019-03-15
  • 2012-08-11
  • 2011-05-01
  • 2018-04-16
相关资源
最近更新 更多