배열 array 분리방법 문의드립니다.

배열 array 분리방법 문의드립니다.

QA

배열 array 분리방법 문의드립니다.

본문

현재 아래와같이 array를 DB에 저장하려고하는데 {n}_test, {n}_date, {n}_date, {n}_desexing는 다른 테이블에 따로 저장하려고하는데 어떻게 하면 좋을지 조언 구해봅니다.. ㅜㅜ

 

* 초록색은 초록색 테이블에, 주황색은 주황색끼리 저장

* _test, _date, _gender, _desexing은 0~n 이 생성될 수 있습니다.

 

Array
(
    [w] => u
    [url] => %2Fbbs%2Fregister_form.php
    [mb_tel] => *** 개인정보보호를 위한 휴대폰번호 노출방지 ***
    [mb_email] => test@test
    [agree] => on
    [agree2] => on
    [0_test] => 이름1
    [0_date] => 2025-02-04
    [0_gender] => male
    [1_test] => 이름2
    [1_date] => 2025-02-05

    [0_gender] => female
    [2_test] => 이름3
    [2_date] => 2025-02-26
    [2_gender] => male
    [2_desexing] => on
)

이 질문에 댓글 쓰기 :

답변 3

다음 코드가 도움이 될지 모르겠습니다.

 


<?php
function array_group_by($arr, $fn) {
    $rv = array();
 
    if (is_callable($fn) == false) {
        return $rv;
    }
 
    array_walk($arr, function ($v, $k) use (&$rv, $fn) {
        $k_new = $fn($v, $k);
        if (isset($rv[$k_new]) == false) {
            $rv[$k_new] = array();
        }
        $rv[$k_new][$k] = $v;
    });
 
    return $rv;
}
 
$data = array(
    'w' => 'u',
    'url' => '%2Fbbs%2Fregister_form.php',
    'mb_tel' => '*** 개인정보보호를 위한 휴대폰번호 노출방지 ***',
    'mb_email' => 'test@test',
    'agree' => 'on',
    'agree2' => 'on',
    '0_test' => '이름1',
    '0_date' => '2025-02-04',
    '0_gender' => 'male',
    '1_test' => '이름2',
    '1_date' => '2025-02-05',
    '0_gender' => 'female',
    '2_test' => '이름3',
    '2_date' => '2025-02-26',
    '2_gender' => 'male',
    '2_desexing' => 'on',
);
 
$data_00 = array_group_by($data, function ($v, $k) {
    if (preg_match('/^\d+_/', $k) === 1) {
        return 'group_b';
    } else {
        return 'group_a';
    }
});
 
$data_01 = array_group_by($data, function ($v, $k) {
    $check = preg_match('/^(\d+)_/', $k, $tmp);
    if ($check === 1) {
        return 'group_' . $tmp[1];
    } else {
        return 'group_a';
    }
});

print_r($data);
/*
Array
(
    [w] => u
    [url] => %2Fbbs%2Fregister_form.php
    [mb_tel] => *** 개인정보보호를 위한 휴대폰번호 노출방지 ***
    [mb_email] => test@test
    [agree] => on
    [agree2] => on
    [0_test] => 이름1
    [0_date] => 2025-02-04
    [0_gender] => female
    [1_test] => 이름2
    [1_date] => 2025-02-05
    [2_test] => 이름3
    [2_date] => 2025-02-26
    [2_gender] => male
    [2_desexing] => on
)
*/

print_r($data_00);
/*
Array
(
    [group_a] => Array
        (
            [w] => u
            [url] => %2Fbbs%2Fregister_form.php
            [mb_tel] => *** 개인정보보호를 위한 휴대폰번호 노출방지 ***
            [mb_email] => test@test
            [agree] => on
            [agree2] => on
        )
    [group_b] => Array
        (
            [0_test] => 이름1
            [0_date] => 2025-02-04
            [0_gender] => female
            [1_test] => 이름2
            [1_date] => 2025-02-05
            [2_test] => 이름3
            [2_date] => 2025-02-26
            [2_gender] => male
            [2_desexing] => on
        )
)
*/
 
print_r($data_01);
/*
Array
(
    [group_a] => Array
        (
            [w] => u
            [url] => %2Fbbs%2Fregister_form.php
            [mb_tel] => *** 개인정보보호를 위한 휴대폰번호 노출방지 ***
            [mb_email] => test@test
            [agree] => on
            [agree2] => on
        )
    [group_0] => Array
        (
            [0_test] => 이름1
            [0_date] => 2025-02-04
            [0_gender] => female
        )
    [group_1] => Array
        (
            [1_test] => 이름2
            [1_date] => 2025-02-05
        )
    [group_2] => Array
        (
            [2_test] => 이름3
            [2_date] => 2025-02-26
            [2_gender] => male
            [2_desexing] => on
        )
)
*/
?>

w값이 u라는 것은 insert가 아니라 update를 사용해야하는 것 같은데 조건이 없으니

insert 예는 다음처럼...

어떤 필드에 어느 값을 넣을 것인지 설명이 없으니 필드명과 넘어온 변수명이 같다는 가정하에

굳이 배열에 담을 필요는 없을 듯 하군요

배열에 넣으려면 $qry1, $qry2 대신 $arr1[$key] = $value; $arr2[$key] = $value; 

 

  ksort($_POST);
   $qry1 = $deli1 = $qry2 = $deli2 = '';
    foreach( $_POST as $key=>$value){
       if($key=='w') continue;
       if( $key =='url' ||  $key=='mb_tel' || $key=='mb_email' || $key=='agree' || $key=='agree2' ){
           $qry1.=$deli1. "$key='$value'; $deli1=',';
       }else{ $qry2.=$deli2. "$key='$value'; $deli2=','; }
    }
      sql_query("insert into table1 set $qry1");
      sql_query("insert into table2 set $qry2");

 

 


<?php
// 배열 데이터
$data = [
    'w' => 'u',
    'url' => '%2Fbbs%2Fregister_form.php',
    'mb_tel' => '*** 개인정보보호를 위한 휴대폰번호 노출방지 ***',
    'mb_email' => 'test@test',
    'agree' => 'on',
    'agree2' => 'on',
    '0_test' => '이름1',
    '0_date' => '2025-02-04',
    '0_gender' => 'male',
    '1_test' => '이름2',
    '1_date' => '2025-02-05',
    '1_gender' => 'female',
    '2_test' => '이름3',
    '2_date' => '2025-02-26',
    '2_gender' => 'male',
    '2_desexing' => 'on'
];
// 데이터베이스 연결
$pdo = new PDO("mysql:host=G5_MYSQL_HOST;dbname=G5_MYSQL_DB", G5_MYSQL_USER, G5_MYSQL_PASSWORD);
// 1. 메인 테이블에 데이터 저장
$stmt = $pdo->prepare("
    INSERT INTO users (w, url, mb_tel, mb_email, agree, agree2)
    VALUES (:w, :url, :mb_tel, :mb_email, :agree, :agree2)
");
$stmt->execute([
    ':w' => $data['w'],
    ':url' => $data['url'],
    ':mb_tel' => $data['mb_tel'],
    ':mb_email' => $data['mb_email'],
    ':agree' => ($data['agree'] === 'on') ? 1 : 0,
    ':agree2' => ($data['agree2'] === 'on') ? 1 : 0
]);
$userId = $pdo->lastInsertId(); // 삽입된 user_id 가져오기
// 2. 서브 테이블에 데이터 저장
foreach ($data as $key => $value) {
    if (preg_match('/^(\d+)_(test|date|gender|desexing)$/', $key, $matches)) {
        $index = $matches[1];
        $field = $matches[2];
        // user_details 테이블에 데이터 삽입
        $stmt = $pdo->prepare("
            INSERT INTO user_details (user_id, test, date, gender, desexing)
            VALUES (:user_id, :test, :date, :gender, :desexing)
            ON DUPLICATE KEY UPDATE
            test = VALUES(test), date = VALUES(date), gender = VALUES(gender), desexing = VALUES(desexing)
        ");
        $stmt->execute([
            ':user_id' => $userId,
            ':test' => $data["{$index}_test"] ?? null,
            ':date' => $data["{$index}_date"] ?? null,
            ':gender' => $data["{$index}_gender"] ?? null,
            ':desexing' => ($data["{$index}_desexing"] ?? 'off') === 'on' ? 1 : 0
        ]);
    }
}
답변을 작성하시기 전에 로그인 해주세요.
전체 129,672 | RSS
QA 내용 검색

회원로그인

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