2016-09-13 5 views
1

각 열에 이미지 이름이 포함되도록 설정된 열이 10 개인 데이터베이스가 있습니다. 사용자는 개별적으로 이미지 소거 할PHP 중첩 된 FOR 루프 문제 해결

himage1, himage2, himage3 등 ... 및 해당 열 값은 화상이 없다는 것을 의미하는, '이 없음'으로 설정된다.

그러나 '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 = ' 'na', himage4 = 'na', himage5 = 'na'등 ...

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

     } 

    } 

} 

이 기능은 작동하지만 한 번만 수행됩니다.

위의 예는 다음과 같이 보일 것이다 :

himage1 = 등 "... img3.php", himage2 = 'NA', himage3 = 'NA', himage4 = 'NA',

안쪽 루프는 'himage1'을 'himage2'와 성공적으로 바꾼 다음 'himage1'을 'himage3'과 비교하여 'himage3'으로 바꿔 다른 모든 필드를 비워 둡니다.

나는이 값을 2 개의 값이 성공적으로 스왑 된 후에도 실행되는 내부 루프로 식별 했으므로 성공적인 스왑에서 내부 루프를 벗어나려고했지만 외부 루프는 여전히 작동하지 않는 것처럼 보입니다.

나는 뭔가를 놓친다는 것을 알고 있으며, 나는 이것에 잠시 머물러 있습니다.

이 문제와 관련된 논리 및 순서에 대한 통찰력을 크게 높이겠습니다.

+2

(그래서 'na' 대신 na의) 당신의 문자열 값을 인용하는 것이 좋습니다입니다. 다른 테이블에 이미지를 저장하는 것이 좋을 것이고이 문제에 직면하지 않을 것입니다. –

답변

0

중첩 된 루프는이 작업을 수행하는 매우 복잡한 방법이라고 생각합니다. 그리고 배열을 검색하는 동안 배열이 변경되는 문제가 있습니다. 나는 이것을 두 단계로 나누기 만하면된다. 우선, 원하는 데이터를 얻으십시오. 나머지는 가져와.

그리고 당신이 그것에있는 동안,이 표는 정규화되지

<?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 

     } 

    } 

}