2016-09-13 4 views
1

私は10列のデータベースを持ち、それぞれがイメージ名を含むように設定されています。PHP入れ子のFORループトラブルシューティング

himage1、himage2、himage3、等...

ユーザは画像がないことを示すために、個々にこれらの画像のいずれかを削除することができ、対応する列の値を「NA」に設定されています。

しかし、以降「himage4」からのフィールドは「ナ」であり、かつユーザーが「himage1」を削除し、その行は次のようになりますことを意味し、3枚の画像があると言う:

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 = '私は2つのネストされたループを使用していますが、関連するロジックに問題があります。

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); 

     } 

    } 

} 

これは機能しますが、1回だけです。

上記の例のようになります。

himage1 = "... img3.php"、himage2 = 'ナ'、himage3 = 'ナ'、himage4 = 'ナ'、など

内側のループは 'himage1'と 'himage2'をスワップしますが、その後 'himage1'と 'himage3'を比較して 'himage3'に置き換え、他のフィールドはすべて空白にします。

これは、2つの値が正常にスワップされた後でも実行されている内部ループとして識別されているため、スワップ成功時に内部ループを切り離そうとしましたが、外側ループがまだ機能していないようです。

私は何かが不足していることを知っています。私はしばらくこのことに固執しています。

この問題に関わる論理と秩序に関するいくつかの洞察は非常に高く評価されます。

+2

このテーブルは正規化されていない、あなたの文字列の値を引用するとよいでしょう。別のテーブルに画像を保存しておけば、この問題に直面することはありません。 –

答えて

0

ネストループはこれを行う非常に複雑な方法だと思います。配列を検索中に変化するという問題があります。私は単純に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); 
    } 


?> 
+0

このソリューションをありがとう。私はこのコードを微調整し、完全に機能するように管理しました。 –

+0

@FrancoViljoen。私はそれが働いてうれしいです。あなたは答えを受け入れることができますか? –

0

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 

     } 

    } 

}