PHP 嵌套 FOR 循环故障排除

标签 php mysql database for-loop

我有一个连续 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 个值后仍在运行的内循环,因此我尝试在成功交换时跳出内循环,但外循环似乎仍然无法正常工作。

我知道我错过了一些东西,我已经坚持了一段时间。

如果能深入了解此问题中涉及的逻辑和顺序,我们将不胜感激。

最佳答案

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

当您使用它时,最好将您的字符串值引用起来(因此 '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 );
    }


?>

关于PHP 嵌套 FOR 循环故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39464424/

相关文章:

如果数据为 Null 或使用 CASE 语句为空,则 MySQl 查询 UPDATE

mysql - 哪个数据库可以用来存储NLP引擎处理过的数据

php - PCRE:环视的 DEFINE 语句

javascript - 为什么 JavaScript 可以处理超过 2038 年的时间戳?

mysql - MySQL 中的定义表哪种字段结构更好?

mysql - 显示日期之间的结果sql

php - 为什么网络应用程序会更喜欢一个网络服务器而不是另一个?

javascript - Ajax 刷新后的事件监听器

c# - ExecuteReader() 后未更新输出参数

sql - 当现有索引包含新索引中的所有列时,为什么创建这个新索引会大大提高性能?