배열 간략하게 하는 것 질문입니다

배열 간략하게 하는 것 질문입니다

QA

배열 간략하게 하는 것 질문입니다

본문

아래 코드는 그누스터디의 내용을 가져온 것입니다~~~


2. write_update.skin.php
 
<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
$wr_1 = "$option1[0],$option1[1],$option1[2],$option1[3],$option1[4]"; // 옵션1
sql_query(" update $write_table set wr_1 = '$wr_1' where wr_id = '$wr_id' ");
?>
위 코드를 아래와 같이 하는 것과 동일한 것인가요?
 
<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
$wr_1 = implode(',', array_slice($option, 0, 5));
sql_query(" update $write_table set wr_1 = '$wr_1' where wr_id = '$wr_id' ");
?>

이 질문에 댓글 쓰기 :

답변 4


// 첫 번째 코드
$wr_1 = "$option1[0],$option1[1],$option1[2],$option1[3],$option1[4]";
// 두 번째 코드 
$wr_1 = implode(',', array_slice($option1, 0, 5));

 

이 두 코드는 실제로 동일한 결과를 만들어내지 않습니다. 그 이유를 설명하겠습니다:

1. 첫 번째 코드의 동작방식:
   - PHP의 문자열 처리 방식에 따라, 배열 요소가 없더라도 빈 문자열로 처리됩니다.
   - 예를 들어 `$option1`에 2개의 요소만 있다면:
     - `$option1[0]` = "값1"
     - `$option1[1]` = "값2" 
     - `$option1[2]` = "" (존재하지 않으므로 빈 문자열)
     - `$option1[3]` = "" (존재하지 않으므로 빈 문자열)
     - `$option1[4]` = "" (존재하지 않으므로 빈 문자열)
   - 결과: "값1,값2,,,,"

2. 두 번째 코드의 동작방식:
   - `array_slice()`는 실제 존재하는 배열 요소만 가져옵니다.
   - 같은 예시에서:
     - `array_slice($option1, 0, 5)`는 존재하는 2개의 요소만 반환
     - `implode()`는 이 2개의 요소만 결합
   - 결과: "값1,값2"

따라서 첫 번째 코드가 "정상 작동"하는 것처럼 보이는 이유는 그누스터디가 항상 5개의 구분된 값(일부는 빈 값이더라도)을 기대하고 있기 때문입니다.

더 정확한 두 번째 코드 작성방법은 다음과 같습니다:


$option1 = array_pad(array_slice($option1, 0, 5), 5, ''); // 배열을 5개 요소로 맞춤
$wr_1 = implode(',', $option1);

이렇게 하면:
1. `array_slice()`로 최대 5개 요소를 가져오고
2. `array_pad()`로 부족한 요소를 빈 문자열로 채워서
3. 첫 번째 코드와 동일한 결과를 만들어냅니다

답변 감사합니다~~원래 아래의 코드를 간략하게 하기위한 것인데 뭐가 저장이 안되네요~~배열을 모두 나열하면 저장이 되구요~~/*
$wr_7 = "$write_option[0],$write_option[1],$write_option[2],$write_option[3],$write_option[4],$write_option[5],$write_option[6],$write_option[7],$write_option[8],$write_option[9],$write_option[10],$write_option[11],$write_option[12],$write_option[13],$write_option[14],$write_option[15],$write_option[16],$write_option[17],$write_option[18],$write_option[19],$write_option[20],$write_option[21],$write_option[22],$write_option[23],$write_option[24],$write_option[25],$write_option[26],$write_option[27],$write_option[28],$write_option[29],$write_option[30],$write_option[31],$write_option[32],$write_option[33],$write_option[34]";
sql_query(" update $write_table set wr_7 = '$wr_7' where wr_id = '$wr_id' ");
*/
~~~~~~~~~~~~~~~~~~~
위처럼 wr_7를 분할하여 글쓰기에 이용하지만 항상 모두를 이용하는 것이 아니구~~
게시글 마다 필요한 것만 선택적으로 뽑아서 글쓰기에 사용하는 구조거든요~~~아래 처럼했지만 저장이 되는 것두 있구 안되는 것두 있구 그러네요~

$write_option = array_pad(array_slice($write_option, 0, 35), 35, ''); // 배열을 5개 요소로 맞춤
$wr_7 = implode(',', $write_option);
sql_query(" update $write_table set wr_7 = '$wr_7' where wr_id = '$wr_id' ");

디버깅을 해봐야 될 것 같습니다.


// 기존 방식의 결과
$wr_7_original = "$write_option[0],$write_option[1],$write_option[2],$write_option[3],$write_option[4],$write_option[5],$write_option[6],$write_option[7],$write_option[8],$write_option[9],$write_option[10],$write_option[11],$write_option[12],$write_option[13],$write_option[14],$write_option[15],$write_option[16],$write_option[17],$write_option[18],$write_option[19],$write_option[20],$write_option[21],$write_option[22],$write_option[23],$write_option[24],$write_option[25],$write_option[26],$write_option[27],$write_option[28],$write_option[29],$write_option[30],$write_option[31],$write_option[32],$write_option[33],$write_option[34]";
echo "기존 방식: " . $wr_7_original . "\n\n";

// 새로운 방식의 결과
$write_option_new = array_pad(array_slice($write_option, 0, 35), 35, '');
$wr_7_new = implode(',', $write_option_new);
echo "새로운 방식: " . $wr_7_new . "\n\n";


참고로 wr_7 의 데이터 타입은 varchar(200) 이라.. 내용이 길면 뒷부분이 짤릴수도 있습니다.

$wr_1 = implode(',', array_slice($option1, 0, 5));
이렇게 해야 동일하겠네요

답변 감사합니다~~
아~~내가 $option1 인데 1 을 빼 먹고 올렸네요~~
하여간 업데이트 하는 곳에서 위처럼 긴 것을 아래처럼 간략하게 나타내는 것이 문제가 없다는 거지요~~? 그런데 이상하게 위의 구문에서  위처럼 죽 나열하면 저장이 되는데 아래 처럼 하면 저장이 안되네요~~

아래 코드를 이용하고 중간에 글쓰기 옵션을 빼먹지 않고 모든 옵션 필드를 작성하는 것으로 하니 저장이 됩니다~~~ 중간중간 글쓰기에 사용하지 않는 것이 있으면 저장이 제대로 되지 않습니다

$wr_7 = '';
for ($i = 0; $i < 35; $i++) {
    $wr_7 .= $write_option[$i] . ($i < 34 ? ',' : '');
}

sql_query(" update $write_table set wr_7 = '$wr_7' where wr_id = '$wr_id' ");

아래 처러하니 글쓰기 옵션에서 일부만 사용해도 저장이 됩니다~


// 사용자가 선택한 옵션을 배열로 가져옵니다.
$selected_options = [];
// 35개의 옵션 중에서 필요한 옵션만 선택
for ($i = 0; $i < 35; $i++) {
    if (isset($_POST['write_option'][$i]) && $_POST['write_option'][$i] !== '') {
        $selected_options[] = $_POST['write_option'][$i];
    } else {
        $selected_options[] = ''; // 빈 문자열 추가
    }
}
// 옵션을 문자열로 변환
$wr_7 = implode(',', $selected_options);
// SQL 쿼리 실행
$sql_query_result = sql_query("UPDATE $write_table SET wr_7 = '$wr_7' WHERE wr_id = '$wr_id'");

 
답변을 작성하시기 전에 로그인 해주세요.
전체 126,916 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT