我有一个连续 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/