【问题标题】:PHP Nested FOR Loops TroubleshootingPHP 嵌套 FOR 循环故障排除
【发布时间】:2017-01-20 17:22:50
【问题描述】:

我有一个连续 10 列的数据库,每列都包含一个图像名称。

himage1、himage2、himage3 等等……

用户可以单独删除任意一张图片,对应的列值设置为'na',表示没有图片。

但是假设有 3 张图片,这意味着从 'himage4' 开始的字段是 'na',并且用户删除了 'himage1',那么该行将如下所示:

himage1 = 'na', himage2 = "...img2.jpg", himage3 = "...im3.jpg", himage4 = 'na', himage5 = 'na' 等等...

这会产生一个问题,因为我有另一列“hnumimage”,它控制设置要显示的图像数量。

但如果 'hnumimage' 为 2,在本例中,由于只有 2 张图像,我用来显示图像的循环仍会尝试显示 'himage1',即使它是空白的。

出于这个原因,我正在尝试创建一个函数来检测字段是否为“na”,然后检查以下任何字段是否具有有效图像。如果是这样,请将该图像值向前移动。

所以在上面的例子中,函数运行后应该是这样的:

himage1 = "...img2.jpg", himage2 = "...im3.jpg", himage3 = 'na', himage4 = 'na', himage5 = 'na' 等等...

我正在使用 2 个嵌套的 for 循环,但涉及的逻辑存在问题。

for ( $i = 1; $i <= 10; $i++ ) {

// IF IMAGE FIELD IS NA
if ( $rs_home_delete_select_array[ 'himage' . $i ] == na ) {

    //CHECK FOLLOWING IMAGES
    for ( $o = $i + 1; $o <= 10; $o++ ) {

        // IF FOUND IMAGE VALUE
        if ( $rs_home_delete_select_array[ 'himage' . $o ] != na ) {

            // MOVE THAT VALUE FORWARD, and CLEAR OLD FIELD
            $vCurrImgVal = $rs_home_delete_select_array[ 'himage' . $o ];
            $sql_arrange_img = "UPDATE tblhome SET himage" . $i . " = '" . $vCurrImgVal . "', himage" . $o . " = 'na' WHERE hid = 1";

            $rs_arrange_img = mysqli_query( $vconn_db, $sql_arrange_img );

        }

    }

}

这有效,但只有一次。

上面的例子看起来像这样:

himage1 = "...img3.php"、himage2 = 'na'、himage3 = 'na'、himage4 = 'na' 等

内部循环成功地将“himage1”与“himage2”交换,但随后还将“himage1”与“himage3”进行比较,因此将其替换为“himage3”,将所有其他字段留空。

即使在成功交换了 2 个值之后,我仍将其识别为内部循环仍在运行,因此我尝试在成功交换时打破内部循环,但外部循环似乎仍然无法正常工作。

我知道我错过了一些东西,而且我已经被困了一段时间了。

我们将不胜感激对这个问题所涉及的逻辑和顺序的一些见解。

【问题讨论】:

  • 此表未标准化。将图像存储在另一个表中会更好,您不会遇到这个问题。

标签: php mysql database for-loop


【解决方案1】:

我认为嵌套循环是一种非常复杂的方法。而且您遇到的问题是在搜索时数组正在更改。我会简单地把它分成两个步骤。首先,得到你想要的数据。然后得到其余的。

当您使用它时,最好引用您的字符串值(所以'na' 而不是na

<?php

    $rs_home_delete_select_array=array('himage1' => 'na', 'himage2' => "...img2.jpg", 'himage3' => "...im3.jpg", 'himage4' => 'na', 'himage5' => 'na');
    $temp = array();


    $idx = 1;

    //Step 1 put data first
    for ( $o = $i + 1; $o <= 10; $o++ ) {
        if ( isset($rs_home_delete_select_array[ 'himage' . $o ]) && $rs_home_delete_select_array[ 'himage' . $o ] != 'na' ) {
            $temp[ 'himage' . $idx ]  = $rs_home_delete_select_array[ 'himage' . $o ];
            $idx++;
        }
    }

    //Step 2. Put 'na' elements later
    for ( $o = $i + 1; $o <= 10; $o++ ) {
        if ( isset($rs_home_delete_select_array[ 'himage' . $o ]) && $rs_home_delete_select_array[ 'himage' . $o ] == 'na' ) {
            $temp[ 'himage' . $idx ]  = $rs_home_delete_select_array[ 'himage' . $o ];
            $idx++;
        }
    }



    //Update DB
    foreach ($temp as $key => $val){
        $sql_arrange_img = "UPDATE tblhome SET `$key` = '$val' WHERE hid = 1";
        $rs_arrange_img = mysqli_query( $vconn_db, $sql_arrange_img );
    }


?>

【讨论】:

  • 感谢您的解决方案。我调整了这段代码并设法让它完美运行。
  • @FrancoViljoen。我很高兴它正在工作。请问您能接受答案吗?
【解决方案2】:

添加break 以在找到下一张替换它的图片后立即退出循环。

for ( $i = 1; $i <= 10; $i++ ) {

// IF IMAGE FIELD IS NA
if ( $rs_home_delete_select_array[ 'himage' . $i ] == na ) {

    //CHECK FOLLOWING IMAGES
    for ( $o = $i + 1; $o <= 10; $o++ ) {

        // IF FOUND IMAGE VALUE
        if ( $rs_home_delete_select_array[ 'himage' . $o ] != na ) {

            // MOVE THAT VALUE FORWARD, and CLEAR OLD FIELD
            $vCurrImgVal = $rs_home_delete_select_array[ 'himage' . $o ];
            $sql_arrange_img = "UPDATE tblhome SET himage" . $i . " = '" . $vCurrImgVal . "', himage" . $o . " = 'na' WHERE hid = 1";

            $rs_arrange_img = mysqli_query( $vconn_db, $sql_arrange_img );
            break; // add break to come out of the loop

        }

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多