코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP Arrays

PHP 배열(Aarrays): 완벽한 사용법과 예제 가이드


PHP 배열이란 무엇인가요?

PHP에서 **배열(Array)**은 여러 개의 값을 하나의 변수에 저장할 수 있는 데이터 구조입니다. 배열을 사용하면 관련된 데이터를 효율적으로 관리하고, 반복문과 결합하여 데이터를 쉽게 처리할 수 있습니다. PHP는 인덱스 배열(Index Array), 연관 배열(Associative Array), 다차원 배열(Multidimensional Array) 등 다양한 배열 유형을 지원하며, 풍부한 내장 함수를 통해 배열을 조작할 수 있습니다. 이 가이드에서는 PHP 배열의 기본 개념부터 고급 활용법까지 상세히 설명하고, 실용적인 예제들을 통해 이해를 돕겠습니다.


1. PHP 배열의 종류

PHP는 다양한 종류의 배열을 지원하며, 각 배열은 특정 상황에 맞게 최적화되어 있습니다.

  1. 인덱스 배열(Index Array): 숫자 인덱스를 사용하여 요소에 접근하는 배열입니다.
  2. 연관 배열(Associative Array): 키(key)를 사용하여 요소에 접근하는 배열입니다.
  3. 다차원 배열(Multidimensional Array): 배열 내에 배열이 포함된 구조입니다.

2. 인덱스 배열(Index Array)

인덱스 배열은 숫자 인덱스를 사용하여 요소에 접근합니다. 기본적으로 인덱스는 0부터 시작합니다.

2.1 배열 생성 및 초기화

<?php
// 빈 배열 생성
$fruits = array();

// 요소 추가
$fruits[] = "사과";
$fruits[] = "바나나";
$fruits[] = "체리";

// 또는 배열 선언 시 초기화
$vegetables = ["당근", "브로콜리", "시금치"];
?>

2.2 배열 요소 접근 및 수정

<?php
$fruits = ["사과", "바나나", "체리"];

// 요소 접근
echo $fruits[0]; // 출력: 사과
echo $fruits[2]; // 출력: 체리

// 요소 수정
$fruits[1] = "블루베리";
echo $fruits[1]; // 출력: 블루베리
?>

2.3 배열의 크기 확인

<?php
$fruits = ["사과", "바나나", "체리"];
echo count($fruits); // 출력: 3
?>


3. 연관 배열(Associative Array)

연관 배열은 키(key)를 사용하여 요소에 접근합니다. 키는 문자열이나 숫자가 될 수 있습니다.

3.1 배열 생성 및 초기화

<?php
// 빈 연관 배열 생성
$user = array();

// 요소 추가
$user["name"] = "홍길동";
$user["age"] = 25;
$user["email"] = "hong@example.com";

// 또는 배열 선언 시 초기화
$person = [
    "name" => "김철수",
    "age" => 30,
    "email" => "kim@example.com"
];
?>

3.2 배열 요소 접근 및 수정

<?php
$person = [
    "name" => "김철수",
    "age" => 30,
    "email" => "kim@example.com"
];

// 요소 접근
echo $person["name"]; // 출력: 김철수
echo $person["email"]; // 출력: kim@example.com

// 요소 수정
$person["age"] = 31;
echo $person["age"]; // 출력: 31
?>

3.3 배열의 키 확인

<?php
$person = [
    "name" => "김철수",
    "age" => 30,
    "email" => "kim@example.com"
];

// 모든 키 가져오기
$keys = array_keys($person);
print_r($keys);

/* 출력:
Array
(
    [0] => name
    [1] => age
    [2] => email
)
*/
?>


4. 다차원 배열(Multidimensional Array)

다차원 배열은 배열 내에 또 다른 배열이 포함된 구조입니다. 주로 복잡한 데이터 구조를 표현할 때 사용됩니다.

4.1 배열 생성 및 초기화

<?php
// 2차원 배열
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 3차원 배열
$threeD = [
    [
        ["a", "b"],
        ["c", "d"]
    ],
    [
        ["e", "f"],
        ["g", "h"]
    ]
];
?>

4.2 배열 요소 접근 및 수정

<?php
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 요소 접근
echo $matrix[0][1]; // 출력: 2
echo $matrix[2][2]; // 출력: 9

// 요소 수정
$matrix[1][1] = 55;
echo $matrix[1][1]; // 출력: 55
?>

4.3 다차원 배열 순회

<?php
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

foreach ($matrix as $row) {
    foreach ($row as $element) {
        echo "$element ";
    }
    echo "<br>";
}

/* 출력:
1 2 3
4 55 6
7 8 9
*/
?>


5. 배열 관련 내장 함수

PHP는 배열을 조작하기 위한 다양한 내장 함수를 제공합니다. 주요 함수들을 살펴보겠습니다.

5.1 배열 추가 및 삭제

  • array_push(): 배열의 끝에 하나 이상의 요소를 추가합니다.

    <?php
    $fruits = ["사과", "바나나"];
    array_push($fruits, "체리", "오렌지");
    print_r($fruits);
    
    /* 출력:
    Array
    (
        [0] => 사과
        [1] => 바나나
        [2] => 체리
        [3] => 오렌지
    )
    */
    ?>
    
    
  • array_pop(): 배열의 마지막 요소를 제거하고 반환합니다.

    <?php
    $fruits = ["사과", "바나나", "체리"];
    $last = array_pop($fruits);
    echo $last; // 출력: 체리
    print_r($fruits);
    
    /* 출력:
    Array
    (
        [0] => 사과
        [1] => 바나나
    )
    */
    ?>
    
    
  • array_shift(): 배열의 첫 번째 요소를 제거하고 반환합니다.

    <?php
    $fruits = ["사과", "바나나", "체리"];
    $first = array_shift($fruits);
    echo $first; // 출력: 사과
    print_r($fruits);
    
    /* 출력:
    Array
    (
        [0] => 바나나
        [1] => 체리
    )
    */
    ?>
    
    
  • array_unshift(): 배열의 시작 부분에 하나 이상의 요소를 추가합니다.

    <?php
    $fruits = ["바나나", "체리"];
    array_unshift($fruits, "사과");
    print_r($fruits);
    
    /* 출력:
    Array
    (
        [0] => 사과
        [1] => 바나나
        [2] => 체리
    )
    */
    ?>
    
    

5.2 배열 합치기

  • array_merge(): 두 개 이상의 배열을 합칩니다.

    <?php
    $array1 = ["a" => "apple", "b" => "banana"];
    $array2 = ["b" => "blueberry", "c" => "cherry"];
    
    $merged = array_merge($array1, $array2);
    print_r($merged);
    
    /* 출력:
    Array
    (
        [a] => apple
        [b] => blueberry
        [c] => cherry
    )
    */
    ?>
    
    
  • array_merge_recursive(): 키가 중복될 경우 값을 배열로 병합합니다.

    <?php
    $array1 = ["a" => "apple", "b" => "banana"];
    $array2 = ["b" => "blueberry", "c" => "cherry"];
    
    $merged = array_merge_recursive($array1, $array2);
    print_r($merged);
    
    /* 출력:
    Array
    (
        [a] => apple
        [b] => Array
            (
                [0] => banana
                [1] => blueberry
            )
        [c] => cherry
    )
    */
    ?>
    
    

5.3 배열 분할 및 슬라이싱

  • array_slice(): 배열의 일부를 추출합니다.

    <?php
    $fruits = ["사과", "바나나", "체리", "오렌지", "포도"];
    $slice = array_slice($fruits, 1, 3);
    print_r($slice);
    
    /* 출력:
    Array
    (
        [0] => 바나나
        [1] => 체리
        [2] => 오렌지
    )
    */
    ?>
    
    
  • array_splice(): 배열의 일부를 제거하고, 그 자리에 다른 요소를 삽입합니다.

    <?php
    $fruits = ["사과", "바나나", "체리", "오렌지", "포도"];
    array_splice($fruits, 2, 2, ["블루베리", "딸기"]);
    print_r($fruits);
    
    /* 출력:
    Array
    (
        [0] => 사과
        [1] => 바나나
        [2] => 블루베리
        [3] => 딸기
        [4] => 포도
    )
    */
    ?>
    
    

5.4 배열 검색 및 필터링

  • array_search(): 배열에서 특정 값을 검색하고, 해당 값의 키를 반환합니다.

    <?php
    $fruits = ["사과", "바나나", "체리"];
    $key = array_search("바나나", $fruits);
    echo $key; // 출력: 1
    ?>
    
    
  • in_array(): 배열에 특정 값이 존재하는지 확인합니다.

    <?php
    $fruits = ["사과", "바나나", "체리"];
    if (in_array("체리", $fruits)) {
        echo "체리가 배열에 있습니다.";
    } else {
        echo "체리가 배열에 없습니다.";
    }
    // 출력: 체리가 배열에 있습니다.
    ?>
    
    
  • array_filter(): 배열의 각 요소에 대해 콜백 함수를 적용하여, 조건에 맞는 요소만을 포함하는 새로운 배열을 반환합니다.

    <?php
    $numbers = [1, 2, 3, 4, 5, 6];
    $even_numbers = array_filter($numbers, function($number) {
        return $number % 2 == 0;
    });
    print_r($even_numbers);
    
    /* 출력:
    Array
    (
        [1] => 2
        [3] => 4
        [5] => 6
    )
    */
    ?>
    
    

5.5 배열 변환

  • array_map(): 배열의 각 요소에 콜백 함수를 적용하여 새로운 배열을 생성합니다.

    <?php
    $numbers = [1, 2, 3, 4, 5];
    $squares = array_map(function($number) {
        return $number ** 2;
    }, $numbers);
    print_r($squares);
    
    /* 출력:
    Array
    (
        [0] => 1
        [1] => 4
        [2] => 9
        [3] => 16
        [4] => 25
    )
    */
    ?>
    
    
  • array_reduce(): 배열의 각 요소를 누적하여 단일 값으로 축소합니다.

    <?php
    $numbers = [1, 2, 3, 4, 5];
    $sum = array_reduce($numbers, function($carry, $item) {
        return $carry + $item;
    }, 0);
    echo "합계: $sum"; // 출력: 합계: 15
    ?>
    
    

6. 배열 반복

PHP에서는 다양한 반복문을 사용하여 배열을 순회할 수 있습니다. 가장 일반적인 반복문은 foreach입니다.

6.1 foreach 반복문

  • *foreach*는 배열의 각 요소를 쉽게 순회할 수 있도록 설계된 반복문입니다.
<?php
$fruits = ["사과", "바나나", "체리"];

// 값만 순회
foreach ($fruits as $fruit) {
    echo "과일: $fruit<br>";
}

// 키와 값을 모두 순회
$people = [
    "a" => "홍길동",
    "b" => "김철수",
    "c" => "이영희"
];

foreach ($people as $key => $name) {
    echo "키: $key, 이름: $name<br>";
}
?>

출력:

과일: 사과
과일: 바나나
과일: 체리
키: a, 이름: 홍길동
키: b, 이름: 김철수
키: c, 이름: 이영희

6.2 for 반복문

for 반복문은 인덱스 배열과 함께 사용할 때 유용합니다.

<?php
$fruits = ["사과", "바나나", "체리"];
$length = count($fruits);

for ($i = 0; $i < $length; $i++) {
    echo "과일: " . $fruits[$i] . "<br>";
}
?>

출력:

과일: 사과
과일: 바나나
과일: 체리

6.3 while 반복문

while 반복문은 조건이 참인 동안 계속해서 반복을 수행합니다.

<?php
$fruits = ["사과", "바나나", "체리"];
$i = 0;
$length = count($fruits);

while ($i < $length) {
    echo "과일: " . $fruits[$i] . "<br>";
    $i++;
}
?>

출력:

과일: 사과
과일: 바나나
과일: 체리


7. 다차원 배열 처리

다차원 배열은 배열 내에 배열이 포함된 구조로, 복잡한 데이터 구조를 표현할 때 사용됩니다.

7.1 배열 순회

<?php
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

foreach ($matrix as $row) {
    foreach ($row as $element) {
        echo "$element ";
    }
    echo "<br>";
}
?>

출력:

1 2 3
4 5 6
7 8 9

7.2 배열 변환

다차원 배열을 일차원 배열로 변환하거나, 특정 조건에 따라 배열을 재구성할 수 있습니다.

<?php
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 모든 요소를 일차원 배열로 변환
$flatten = array_merge(...$matrix);
print_r($flatten);

/* 출력:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
)
*/
?>


8. 배열 정렬

PHP는 배열을 다양한 방식으로 정렬할 수 있는 내장 함수를 제공합니다.

8.1 sort()

  • *sort()*는 배열을 오름차순으로 정렬하며, 인덱스를 재배열합니다.
<?php
$fruits = ["바나나", "사과", "체리"];
sort($fruits);
print_r($fruits);

/* 출력:
Array
(
    [0] => 사과
    [1] => 바나나
    [2] => 체리
)
*/
?>

8.2 rsort()

  • *rsort()*는 배열을 내림차순으로 정렬하며, 인덱스를 재배열합니다.
<?php
$numbers = [3, 1, 4, 1, 5];
rsort($numbers);
print_r($numbers);

/* 출력:
Array
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 1
    [4] => 1
)
*/
?>

8.3 asort()

  • *asort()*는 연관 배열을 값 기준으로 오름차순 정렬하며, 키는 유지됩니다.
<?php
$ages = [
    "홍길동" => 25,
    "김철수" => 30,
    "이영희" => 22
];
asort($ages);
print_r($ages);

/* 출력:
Array
(
    [이영희] => 22
    [홍길동] => 25
    [김철수] => 30
)
*/
?>

8.4 ksort()

  • *ksort()*는 연관 배열을 키 기준으로 오름차순 정렬합니다.
<?php
$ages = [
    "홍길동" => 25,
    "김철수" => 30,
    "이영희" => 22
];
ksort($ages);
print_r($ages);

/* 출력:
Array
(
    [김철수] => 30
    [이영희] => 22
    [홍길동] => 25
)
*/
?>

8.5 usort()

  • *usort()*는 사용자 정의 비교 함수를 사용하여 배열을 정렬합니다.
<?php
$people = [
    ["name" => "홍길동", "age" => 25],
    ["name" => "김철수", "age" => 30],
    ["name" => "이영희", "age" => 22]
];

usort($people, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

print_r($people);

/* 출력:
Array
(
    [0] => Array
        (
            [name] => 이영희
            [age] => 22
        )

    [1] => Array
        (
            [name] => 홍길동
            [age] => 25
        )

    [2] => Array
        (
            [name] => 김철수
            [age] => 30
        )
)
*/
?>


9. 배열과 함수의 결합 활용

배열과 함수를 결합하여 복잡한 데이터 처리를 효율적으로 수행할 수 있습니다.

9.1 배열 요소 필터링

<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even_numbers = array_filter($numbers, function($number) {
    return $number % 2 === 0;
});
print_r($even_numbers);

/* 출력:
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
)
*/
?>

9.2 배열 요소 변환

<?php
$names = ["alice", "bob", "charlie"];
$capitalized = array_map(function($name) {
    return ucfirst($name);
}, $names);
print_r($capitalized);

/* 출력:
Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)
*/
?>

9.3 배열 요소 누적

<?php
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function($carry, $item) {
    return $carry + $item;
}, 0);
echo "합계: $sum"; // 출력: 합계: 15
?>


10. 배열과 객체 지향 프로그래밍(OOP)

배열은 객체 지향 프로그래밍에서 데이터 컬렉션을 관리하는 데 유용하게 사용됩니다.

10.1 객체의 속성 배열화

<?php
class User {
    public $name;
    public $age;
    public $email;

    public function __construct($name, $age, $email) {
        $this->name = $name;
        $this->age = $age;
        $this->email = $email;
    }

    public function toArray() {
        return [
            "name" => $this->name,
            "age" => $this->age,
            "email" => $this->email
        ];
    }
}

$user = new User("홍길동", 25, "hong@example.com");
print_r($user->toArray());

/* 출력:
Array
(
    [name] => 홍길동
    [age] => 25
    [email] => hong@example.com
)
*/
?>

10.2 객체 컬렉션과 배열

<?php
class Product {
    public $id;
    public $name;
    public $price;

    public function __construct($id, $name, $price) {
        $this->id    = $id;
        $this->name  = $name;
        $this->price = $price;
    }

    public function displayInfo() {
        echo "ID: {$this->id}, 이름: {$this->name}, 가격: ₩" . number_format($this->price) . "<br>";
    }
}

$products = [
    new Product(1, "노트북", 1500000),
    new Product(2, "스마트폰", 800000),
    new Product(3, "태블릿", 500000)
];

foreach ($products as $product) {
    $product->displayInfo();
}

/* 출력:
ID: 1, 이름: 노트북, 가격: ₩1,500,000
ID: 2, 이름: 스마트폰, 가격: ₩800,000
ID: 3, 이름: 태블릿, 가격: ₩500,000
*/
?>


11. 배열과 메모리 관리

배열을 사용할 때는 메모리 사용량을 최적화하는 것이 중요합니다, 특히 대용량 데이터를 처리할 경우 더욱 그렇습니다.

11.1 불필요한 배열 요소 제거

<?php
$largeArray = range(1, 1000000);

// 사용이 끝난 배열 요소 제거
unset($largeArray);
?>

11.2 참조를 통한 배열 순회

<?php
$numbers = range(1, 1000);

foreach ($numbers as &$number) {
    $number *= 2;
}

unset($number); // 참조 해제

print_r($numbers);
?>

주의: 참조를 사용한 후에는 반드시 unset()을 호출하여 참조를 해제해야 합니다.


12. 배열과 보안 고려사항

배열을 사용할 때는 특히 사용자 입력을 처리할 경우 보안에 유의해야 합니다.

12.1 입력값 검증

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $data = $_POST['data'];

    // 배열 필터링 예제
    $allowed = ["apple", "banana", "cherry"];
    $filtered = array_filter($data, function($item) use ($allowed) {
        return in_array($item, $allowed);
    });

    print_r($filtered);
}
?>

12.2 SQL 인젝션 방지

데이터베이스와 연동할 때는 배열 데이터를 안전하게 처리해야 합니다.

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 연결 확인
if ($conn->connect_error) {
    die("연결 실패: " . $conn->connect_error);
}

// 사용자 입력 받기 (예: 다중 선택 폼)
$selected_fruits = $_POST['fruits']; // 예: ["사과", "바나나"]

// 준비된 문장 사용
$stmt = $conn->prepare("INSERT INTO selected_fruits (fruit) VALUES (?)");
$stmt->bind_param("s", $fruit);

foreach ($selected_fruits as $fruit) {
    // 입력값 검증 및 필터링
    if (in_array($fruit, ["사과", "바나나", "체리"])) {
        $stmt->execute();
    }
}

$stmt->close();
$conn->close();
?>


13. PHP 8.0 이상의 배열 관련 새로운 기능

PHP 8.0부터는 배열 관련 새로운 기능들이 도입되어 배열을 더 효율적으로 다룰 수 있게 되었습니다.

13.1 Match 표현식과 배열

match 표현식을 사용하여 배열의 특정 값을 기반으로 조건을 처리할 수 있습니다.

<?php
$status = "approved";

$message = match ($status) {
    "pending" => "승인 대기 중입니다.",
    "approved" => "승인되었습니다.",
    "rejected" => "거부되었습니다.",
    default => "알 수 없는 상태입니다.",
};

echo $message; // 출력: 승인되었습니다.
?>

13.2 Array unpacking (배열 펼치기)

배열을 다른 배열에 쉽게 병합할 수 있습니다.

<?php
$array1 = ["a" => "apple", "b" => "banana"];
$array2 = ["c" => "cherry", "d" => "date"];
$merged = [...$array1, ...$array2];
print_r($merged);

/* 출력:
Array
(
    [a] => apple
    [b] => banana
    [c] => cherry
    [d] => date
)
*/
?>

13.3 함수와 배열의 타입 힌팅 개선

PHP 8.0부터 배열 타입 힌팅이 더욱 강화되어, 함수의 매개변수와 반환값에 대해 더 명확하게 정의할 수 있습니다.

<?php
function processNumbers(array $numbers): array {
    return array_map(fn($n) => $n * 2, $numbers);
}

print_r(processNumbers([1, 2, 3]));

/* 출력:
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)
*/
?>


14. PHP 배열 Best Practices

14.1 가독성 유지

  • 들여쓰기: 배열 선언 시 적절한 들여쓰기를 사용하여 가독성을 높입니다.

    <?php
    $user = [
        "name" => "홍길동",
        "age" => 25,
        "email" => "hong@example.com",
        "address" => [
            "street" => "서울시 강남구",
            "zip" => "12345"
        ]
    ];
    ?>
    
    
  • 명확한 키 사용: 연관 배열의 키는 의미 있는 이름을 사용하여 데이터의 의도를 명확히 합니다.

    <?php
    $product = [
        "id" => 101,
        "name" => "노트북",
        "price" => 1500000,
        "stock" => 50
    ];
    ?>
    
    

14.2 배열 크기 최적화

불필요하게 큰 배열을 사용하는 것을 피하고, 필요한 만큼만 데이터를 저장합니다.

<?php
// 비권장: 큰 데이터를 불필요하게 저장
$numbers = range(1, 1000000);

// 권장: 필요한 범위만 저장
$numbers = range(1, 1000);
?>

14.3 배열 함수 활용

가능한 한 PHP의 내장 배열 함수를 활용하여 성능과 코드 간결성을 향상시킵니다.

<?php
$numbers = [1, 2, 3, 4, 5];

// 배열의 모든 요소에 함수 적용
$squares = array_map(fn($n) => $n ** 2, $numbers);

// 짝수만 필터링
$even = array_filter($numbers, fn($n) => $n % 2 === 0);

// 배열 합계
$sum = array_sum($numbers);
?>

14.4 배열 참조 사용 시 주의

배열을 참조로 순회할 때는 반드시 루프 후 참조를 해제해야 예기치 않은 동작을 방지할 수 있습니다.

<?php
$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as &$number) {
    $number *= 2;
}

unset($number); // 참조 해제

print_r($numbers);

/* 출력:
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)
*/
?>


15. 실용적인 배열 예제

15.1 사용자 목록 출력

<?php
$users = [
    ["name" => "홍길동", "age" => 25, "email" => "hong@example.com"],
    ["name" => "김철수", "age" => 30, "email" => "kim@example.com"],
    ["name" => "이영희", "age" => 22, "email" => "lee@example.com"]
];

foreach ($users as $user) {
    echo "이름: {$user['name']}, 나이: {$user['age']}, 이메일: {$user['email']}<br>";
}

/* 출력:
이름: 홍길동, 나이: 25, 이메일: hong@example.com
이름: 김철수, 나이: 30, 이메일: kim@example.com
이름: 이영희, 나이: 22, 이메일: lee@example.com
*/
?>

15.2 상품 재고 관리

<?php
$products = [
    ["id" => 101, "name" => "노트북", "stock" => 50],
    ["id" => 102, "name" => "스마트폰", "stock" => 0],
    ["id" => 103, "name" => "태블릿", "stock" => 30]
];

foreach ($products as $product) {
    if ($product['stock'] > 0) {
        echo "{$product['name']}은(는) 재고가 있습니다.<br>";
    } else {
        echo "{$product['name']}은(는) 품절되었습니다.<br>";
    }
}

/* 출력:
노트북은(는) 재고가 있습니다.
스마트폰은(는) 품절되었습니다.
태블릿은(는) 재고가 있습니다.
*/
?>

15.3 다차원 배열에서 특정 요소 찾기

<?php
$users = [
    ["id" => 1, "name" => "홍길동", "email" => "hong@example.com"],
    ["id" => 2, "name" => "김철수", "email" => "kim@example.com"],
    ["id" => 3, "name" => "이영희", "email" => "lee@example.com"]
];

function findUserById($users, $id) {
    foreach ($users as $user) {
        if ($user['id'] === $id) {
            return $user;
        }
    }
    return null;
}

$user = findUserById($users, 2);
if ($user) {
    echo "사용자 찾음: {$user['name']}, 이메일: {$user['email']}";
} else {
    echo "사용자를 찾을 수 없습니다.";
}

// 출력: 사용자 찾음: 김철수, 이메일: kim@example.com
?>


16. 배열과 메모리 관리

배열을 사용할 때는 메모리 사용량을 효율적으로 관리하는 것이 중요합니다, 특히 대용량 데이터를 처리할 때는 더욱 그렇습니다.

16.1 배열 요소 제거

불필요한 배열 요소를 제거하여 메모리를 절약할 수 있습니다.

<?php
$numbers = range(1, 1000000);

// 사용 후 배열 요소 제거
unset($numbers);
?>

16.2 참조를 통한 배열 처리

배열을 참조로 순회하여 메모리 사용을 줄일 수 있습니다. 단, 참조를 사용한 후 반드시 해제해야 합니다.

<?php
$numbers = range(1, 1000);

foreach ($numbers as &$number) {
    $number *= 2;
}

unset($number); // 참조 해제

print_r($numbers);
?>


17. 배열과 보안 고려사항

배열을 사용할 때는 특히 사용자 입력을 처리할 경우 보안에 유의해야 합니다.

17.1 입력값 검증

사용자 입력을 배열로 받을 때는 입력값을 검증하고 필터링해야 합니다.

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $selected_fruits = $_POST['fruits']; // 예: ["사과", "바나나"]

    // 허용된 값만 필터링
    $allowed = ["사과", "바나나", "체리"];
    $filtered_fruits = array_filter($selected_fruits, function($fruit) use ($allowed) {
        return in_array($fruit, $allowed);
    });

    print_r($filtered_fruits);
}
?>

17.2 SQL 인젝션 방지

배열 데이터를 데이터베이스에 안전하게 삽입하기 위해 준비된 문장(Prepared Statements)을 사용합니다.

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 연결 확인
if ($conn->connect_error) {
    die("연결 실패: " . $conn->connect_error);
}

// 사용자 입력 받기 (예: 다중 선택 폼)
$selected_fruits = $_POST['fruits']; // 예: ["사과", "바나나"]

// 준비된 문장 사용
$stmt = $conn->prepare("INSERT INTO selected_fruits (fruit) VALUES (?)");
$stmt->bind_param("s", $fruit);

foreach ($selected_fruits as $fruit) {
    // 입력값 검증 및 필터링
    if (in_array($fruit, ["사과", "바나나", "체리"])) {
        $stmt->execute();
    }
}

$stmt->close();
$conn->close();
?>

주의: 실제 애플리케이션에서는 비밀번호를 평문으로 저장하지 않고, 해싱(Hashing)하여 저장해야 합니다.


18. PHP 배열 Best Practices

18.1 가독성 유지

  • 들여쓰기: 배열 선언 시 적절한 들여쓰기를 사용하여 가독성을 높입니다.

    <?php
    $user = [
        "name" => "홍길동",
        "age" => 25,
        "email" => "hong@example.com",
        "address" => [
            "street" => "서울시 강남구",
            "zip" => "12345"
        ]
    ];
    ?>
    
    
  • 명확한 키 사용: 연관 배열의 키는 의미 있는 이름을 사용하여 데이터의 의도를 명확히 합니다.

    <?php
    $product = [
        "id" => 101,
        "name" => "노트북",
        "price" => 1500000,
        "stock" => 50
    ];
    ?>
    
    

18.2 배열 크기 최적화

불필요하게 큰 배열을 사용하는 것을 피하고, 필요한 만큼만 데이터를 저장합니다.

<?php
// 비권장: 큰 데이터를 불필요하게 저장
$numbers = range(1, 1000000);

// 권장: 필요한 범위만 저장
$numbers = range(1, 1000);
?>

18.3 배열 함수 활용

가능한 한 PHP의 내장 배열 함수를 활용하여 성능과 코드 간결성을 향상시킵니다.

<?php
$numbers = [1, 2, 3, 4, 5];

// 배열의 모든 요소에 함수 적용
$squares = array_map(fn($n) => $n ** 2, $numbers);

// 짝수만 필터링
$even = array_filter($numbers, fn($n) => $n % 2 === 0);

// 배열 합계
$sum = array_sum($numbers);
?>

18.4 참조를 통한 배열 처리 주의

배열을 참조로 순회할 때는 반드시 루프 후 참조를 해제해야 예기치 않은 동작을 방지할 수 있습니다.

<?php
$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as &$number) {
    $number *= 2;
}

unset($number); // 참조 해제

print_r($numbers);

/* 출력:
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)
*/
?>


19. PHP 배열 관련 추가 예제

19.1 사용자 역할에 따른 권한 확인

<?php
function checkPermission($user_role, $action) {
    $permissions = [
        "admin" => ["create", "read", "update", "delete"],
        "editor" => ["create", "read", "update"],
        "subscriber" => ["read"]
    ];

    if (!array_key_exists($user_role, $permissions)) {
        return "유효하지 않은 사용자 역할입니다.";
    }

    if (in_array($action, $permissions[$user_role])) {
        return "권한이 있습니다: $action";
    } else {
        return "권한이 없습니다: $action";
    }
}

echo checkPermission("editor", "delete"); // 출력: 권한이 없습니다: delete
echo "<br>";
echo checkPermission("admin", "delete");  // 출력: 권한이 있습니다: delete
?>

19.2 상품 목록에서 재고 확인

<?php
$products = [
    ["name" => "상품A", "stock" => 10],
    ["name" => "상품B", "stock" => 0],
    ["name" => "상품C", "stock" => 5],
];

foreach ($products as $product) {
    if ($product['stock'] > 0) {
        echo "{$product['name']}은(는) 재고가 있습니다.<br>";
    } else {
        echo "{$product['name']}은(는) 품절되었습니다.<br>";
    }
}

/* 출력:
상품A은(는) 재고가 있습니다.
상품B은(는) 품절되었습니다.
상품C은(는) 재고가 있습니다.
*/
?>

19.3 배열 병합과 순회

<?php
$array1 = ["a" => "apple", "b" => "banana"];
$array2 = ["b" => "blueberry", "c" => "cherry"];

$merged = [];
foreach ($array1 as $key => $value) {
    $merged[$key] = $value;
}

foreach ($array2 as $key => $value) {
    if (!isset($merged[$key])) {
        $merged[$key] = $value;
    }
}

print_r($merged);

/* 출력:
Array
(
    [a] => apple
    [b] => banana
    [c] => cherry
)
*/
?>


20. PHP 배열과 객체 지향 프로그래밍(OOP)

배열은 객체 지향 프로그래밍에서 데이터 컬렉션을 관리하는 데 유용하게 사용됩니다.

20.1 클래스 메서드에서 배열 사용

<?php
class Inventory {
    private $products = [];

    public function addProduct($id, $name, $stock) {
        $this->products[] = [
            "id" => $id,
            "name" => $name,
            "stock" => $stock
        ];
    }

    public function listProducts() {
        foreach ($this->products as $product) {
            echo "ID: {$product['id']}, 이름: {$product['name']}, 재고: {$product['stock']}<br>";
        }
    }
}

$inventory = new Inventory();
$inventory->addProduct(101, "노트북", 50);
$inventory->addProduct(102, "스마트폰", 0);
$inventory->addProduct(103, "태블릿", 30);
$inventory->listProducts();

/* 출력:
ID: 101, 이름: 노트북, 재고: 50
ID: 102, 이름: 스마트폰, 재고: 0
ID: 103, 이름: 태블릿, 재고: 30
*/
?>

20.2 Iterator 인터페이스를 구현한 클래스 사용

<?php
class CarCollection implements Iterator {
    private $cars = [];
    private $position = 0;

    public function __construct() {
        $this->position = 0;
    }

    public function addCar($brand, $model) {
        $this->cars[] = ["brand" => $brand, "model" => $model];
    }

    public function current() {
        return $this->cars[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        ++$this->position;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->cars[$this->position]);
    }
}

$carCollection = new CarCollection();
$carCollection->addCar("Toyota", "Corolla");
$carCollection->addCar("Honda", "Civic");
$carCollection->addCar("Ford", "Mustang");

foreach ($carCollection as $car) {
    echo "브랜드: {$car['brand']}, 모델: {$car['model']}<br>";
}

/* 출력:
브랜드: Toyota, 모델: Corolla
브랜드: Honda, 모델: Civic
브랜드: Ford, 모델: Mustang
*/
?>


21. PHP 배열과 메모리 제한

PHP 스크립트는 메모리 제한(memory_limit)을 가지고 있으며, 배열을 사용할 때는 메모리 사용량을 신중히 관리해야 합니다. 특히 대용량 데이터를 처리할 때는 다음과 같은 점을 고려해야 합니다.

21.1 배열 크기 제한

<?php
ini_set('memory_limit', '512M'); // 메모리 제한 설정

$largeArray = range(1, 1000000); // 100만 개의 요소

echo "배열 크기: " . count($largeArray) . "<br>";
echo "메모리 사용량: " . memory_get_usage(true) . " bytes";
?>

출력 예시:

배열 크기: 1000000
메모리 사용량: 8000000 bytes

21.2 메모리 최적화 팁

  • 불필요한 배열 요소 제거: 사용이 끝난 배열은 unset()을 통해 메모리에서 해제합니다.

    <?php
    $data = range(1, 1000000);
    
    // 데이터 처리
    // ...
    
    unset($data); // 메모리 해제
    ?>
    
    
  • 참조를 통한 배열 처리: 배열을 참조로 순회하여 메모리 사용을 줄일 수 있습니다.

    <?php
    $numbers = range(1, 1000);
    
    foreach ($numbers as &$number) {
        $number *= 2;
    }
    
    unset($number); // 참조 해제
    
    print_r($numbers);
    ?>
    
    

22. PHP 배열과 성능 최적화

배열을 사용할 때는 성능을 최적화하기 위해 몇 가지 전략을 사용할 수 있습니다.

22.1 배열 함수 활용

PHP의 내장 배열 함수는 일반적인 반복문보다 성능이 우수할 수 있습니다.

<?php
$numbers = range(1, 1000);

// 배열 함수 사용
$squares = array_map(fn($n) => $n ** 2, $numbers);
?>

22.2 루프 조건 최적화

루프 내에서 반복적으로 계산되는 조건은 루프 외부로 이동하여 성능을 향상시킵니다.

<?php
$fruits = ["사과", "바나나", "체리"];
$length = count($fruits); // 루프 외부에서 한 번 계산

for ($i = 0; $i < $length; $i++) {
    echo "과일: " . $fruits[$i] . "<br>";
}
?>

22.3 배열의 참조 최소화

배열 요소에 접근할 때 참조를 최소화하여 성능을 향상시킵니다.

<?php
$users = getUsers(); // 사용자 목록을 가져오는 함수
$userCount = count($users); // 사용자 수

for ($i = 0; $i < $userCount; $i++) {
    echo "이름: {$users[$i]['name']}<br>";
}
?>


23. PHP 배열과 보안 고려사항

배열을 사용할 때는 특히 사용자 입력을 처리할 경우 보안에 유의해야 합니다.

23.1 배열 기반 CSRF 토큰 관리

배열을 사용하여 CSRF 토큰을 관리하고, 세션과 연동할 수 있습니다.

<?php
session_start();

// CSRF 토큰 생성
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// 폼에 CSRF 토큰 포함
?>

<form method="post" action="process.php">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
    <!-- 기타 폼 필드 -->
    <input type="submit" value="제출">
</form>

<?php
session_start();

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $csrf_token = $_POST['csrf_token'] ?? '';

    if (!hash_equals($_SESSION['csrf_token'], $csrf_token)) {
        die("CSRF 토큰이 일치하지 않습니다.");
    }

    // 폼 처리 로직
}
?>

23.2 XSS 방지

배열 데이터를 출력할 때는 HTML 이스케이프를 통해 XSS 공격을 방지합니다.

<?php
$comments = [
    ["user" => "홍길동", "comment" => "<script>alert('XSS');</script>"],
    ["user" => "김철수", "comment" => "안녕하세요!"]
];

foreach ($comments as $comment) {
    $safe_user = htmlspecialchars($comment['user'], ENT_QUOTES, 'UTF-8');
    $safe_comment = htmlspecialchars($comment['comment'], ENT_QUOTES, 'UTF-8');
    echo "사용자: $safe_user, 댓글: $safe_comment<br>";
}
?>

출력:

사용자: 홍길동, 댓글: &lt;script&gt;alert('XSS');&lt;/script&gt;
사용자: 김철수, 댓글: 안녕하세요!


24. PHP 8.0 이상의 배열 관련 새로운 기능

PHP 8.0부터는 배열 관련 새로운 기능들이 도입되어 배열을 더 효율적으로 다룰 수 있게 되었습니다.

24.1 Array unpacking (배열 펼치기)

배열을 다른 배열에 쉽게 병합할 수 있습니다.

<?php
$array1 = ["a" => "apple", "b" => "banana"];
$array2 = ["c" => "cherry", "d" => "date"];
$merged = [...$array1, ...$array2];
print_r($merged);

/* 출력:
Array
(
    [a] => apple
    [b] => banana
    [c] => cherry
    [d] => date
)
*/
?>

24.2 Union Types with Arrays

함수의 매개변수나 반환값에 여러 타입을 지정할 수 있습니다.

<?php
function processItems(array|string $items): void {
    if (is_array($items)) {
        foreach ($items as $item) {
            echo "아이템: $item<br>";
        }
    } else {
        echo "아이템: $items<br>";
    }
}

processItems(["사과", "바나나"]); // 출력: 아이템: 사과, 아이템: 바나나
processItems("체리");            // 출력: 아이템: 체리
?>

24.3 Named Arguments with Arrays

배열을 함수에 전달할 때 명명된 인자를 사용할 수 있습니다.

<?php
function createUser($name, $email, $age) {
    echo "이름: $name, 이메일: $email, 나이: $age";
}

createUser(age: 25, email: "alice@example.com", name: "앨리스");
// 출력: 이름: 앨리스, 이메일: alice@example.com, 나이: 25
?>


25. PHP 배열 관련 주의사항

25.1 배열 키 중복 주의

연관 배열에서 동일한 키를 여러 번 사용하면 마지막 값으로 덮어씌워집니다.

<?php
$array = [
    "a" => "apple",
    "b" => "banana",
    "a" => "apricot"
];
print_r($array);

/* 출력:
Array
(
    [a] => apricot
    [b] => banana
)
*/
?>

25.2 배열 순회 시 인덱스 주의

배열을 순회할 때 인덱스가 예상과 다르게 변경될 수 있으므로 주의해야 합니다.

<?php
$fruits = ["사과", "바나나", "체리"];

// 배열 요소 제거
unset($fruits[1]);

foreach ($fruits as $index => $fruit) {
    echo "인덱스: $index, 과일: $fruit<br>";
}

/* 출력:
인덱스: 0, 과일: 사과
인덱스: 2, 과일: 체리
*/
?>

해결 방법: 배열을 다시 인덱싱하거나 array_values()를 사용하여 연속된 인덱스를 부여합니다.

<?php
$fruits = ["사과", "바나나", "체리"];
unset($fruits[1]);

$fruits = array_values($fruits);
print_r($fruits);

/* 출력:
Array
(
    [0] => 사과
    [1] => 체리
)
*/
?>


26. PHP 배열 Best Practices

26.1 가독성 유지

  • 들여쓰기: 배열 선언 시 적절한 들여쓰기를 사용하여 가독성을 높입니다.

    <?php
    $user = [
        "name" => "홍길동",
        "age" => 25,
        "email" => "hong@example.com",
        "address" => [
            "street" => "서울시 강남구",
            "zip" => "12345"
        ]
    ];
    ?>
    
    
  • 명확한 키 사용: 연관 배열의 키는 의미 있는 이름을 사용하여 데이터의 의도를 명확히 합니다.

    <?php
    $product = [
        "id" => 101,
        "name" => "노트북",
        "price" => 1500000,
        "stock" => 50
    ];
    ?>
    
    

26.2 배열 크기 최적화

불필요하게 큰 배열을 사용하는 것을 피하고, 필요한 만큼만 데이터를 저장합니다.

<?php
// 비권장: 큰 데이터를 불필요하게 저장
$numbers = range(1, 1000000);

// 권장: 필요한 범위만 저장
$numbers = range(1, 1000);
?>

26.3 배열 함수 활용

가능한 한 PHP의 내장 배열 함수를 활용하여 성능과 코드 간결성을 향상시킵니다.

<?php
$numbers = [1, 2, 3, 4, 5];

// 배열의 모든 요소에 함수 적용
$squares = array_map(fn($n) => $n ** 2, $numbers);

// 짝수만 필터링
$even = array_filter($numbers, fn($n) => $n % 2 === 0);

// 배열 합계
$sum = array_sum($numbers);
?>

26.4 참조를 통한 배열 처리 주의

배열을 참조로 순회할 때는 반드시 루프 후 참조를 해제해야 예기치 않은 동작을 방지할 수 있습니다.

<?php
$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as &$number) {
    $number *= 2;
}

unset($number); // 참조 해제

print_r($numbers);

/* 출력:
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)
*/
?>


27. PHP 배열과 함수의 결합 활용

배열과 함수를 결합하여 복잡한 데이터 처리를 효율적으로 수행할 수 있습니다.

27.1 배열 요소 필터링

<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even_numbers = array_filter($numbers, function($number) {
    return $number % 2 === 0;
});
print_r($even_numbers);

/* 출력:
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
)
*/
?>

27.2 배열 요소 변환

<?php
$names = ["alice", "bob", "charlie"];
$capitalized = array_map(function($name) {
    return ucfirst($name);
}, $names);
print_r($capitalized);

/* 출력:
Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)
*/
?>

27.3 배열 요소 누적

<?php
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function($carry, $item) {
    return $carry + $item;
}, 0);
echo "합계: $sum"; // 출력: 합계: 15
?>


28. PHP 배열과 데이터베이스 연동

배열은 데이터베이스에서 가져온 데이터를 처리하거나, 데이터베이스에 데이터를 삽입할 때 유용하게 사용됩니다.

28.1 데이터베이스에서 데이터 가져오기

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 연결 확인
if ($conn->connect_error) {
    die("연결 실패: " . $conn->connect_error);
}

// 쿼리 실행
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

$users = [];
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $users[] = $row;
    }
} else {
    echo "사용자가 없습니다.";
}

$conn->close();

// 배열 출력
print_r($users);

/* 예시 출력:
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 홍길동
            [email] => hong@example.com
        )

    [1] => Array
        (
            [id] => 2
            [name] => 김철수
            [email] => kim@example.com
        )

    [2] => Array
        (
            [id] => 3
            [name] => 이영희
            [email] => lee@example.com
        )
)
*/
?>

28.2 데이터베이스에 배열 데이터 삽입하기

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 연결 확인
if ($conn->connect_error) {
    die("연결 실패: " . $conn->connect_error);
}

// 사용자 입력 받기 (예: 다중 선택 폼)
$selected_fruits = $_POST['fruits']; // 예: ["사과", "바나나"]

// 준비된 문장 사용
$stmt = $conn->prepare("INSERT INTO selected_fruits (fruit) VALUES (?)");
$stmt->bind_param("s", $fruit);

foreach ($selected_fruits as $fruit) {
    // 입력값 검증 및 필터링
    if (in_array($fruit, ["사과", "바나나", "체리"])) {
        $stmt->execute();
    }
}

$stmt->close();
$conn->close();

echo "선택한 과일이 성공적으로 저장되었습니다.";
?>

주의: 실제 애플리케이션에서는 더 강력한 입력 검증과 에러 처리가 필요합니다.


29. PHP 배열과 객체 지향 프로그래밍(OOP)

객체 지향 프로그래밍에서 배열은 데이터 컬렉션을 관리하는 데 유용하게 사용됩니다.

29.1 클래스 메서드에서 배열 사용

<?php
class Inventory {
    private $products = [];

    public function addProduct($id, $name, $stock) {
        $this->products[] = [
            "id" => $id,
            "name" => $name,
            "stock" => $stock
        ];
    }

    public function listProducts() {
        foreach ($this->products as $product) {
            echo "ID: {$product['id']}, 이름: {$product['name']}, 재고: {$product['stock']}<br>";
        }
    }
}

$inventory = new Inventory();
$inventory->addProduct(101, "노트북", 50);
$inventory->addProduct(102, "스마트폰", 0);
$inventory->addProduct(103, "태블릿", 30);
$inventory->listProducts();

/* 출력:
ID: 101, 이름: 노트북, 재고: 50
ID: 102, 이름: 스마트폰, 재고: 0
ID: 103, 이름: 태블릿, 재고: 30
*/
?>

29.2 Iterator 인터페이스를 구현한 클래스 사용

<?php
class CarCollection implements Iterator {
    private $cars = [];
    private $position = 0;

    public function __construct() {
        $this->position = 0;
    }

    public function addCar($brand, $model) {
        $this->cars[] = ["brand" => $brand, "model" => $model];
    }

    public function current() {
        return $this->cars[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        ++$this->position;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->cars[$this->position]);
    }
}

$carCollection = new CarCollection();
$carCollection->addCar("Tesla", "Model S");
$carCollection->addCar("BMW", "X5");
$carCollection->addCar("Audi", "A4");

foreach ($carCollection as $car) {
    echo "브랜드: {$car['brand']}, 모델: {$car['model']}<br>";
}

/* 출력:
브랜드: Tesla, 모델: Model S
브랜드: BMW, 모델: X5
브랜드: Audi, 모델: A4
*/
?>


30. PHP 배열과 비동기 처리

PHP는 기본적으로 동기 방식으로 실행되지만, 배열과 함께 비동기 처리를 구현할 수 있는 방법들도 존재합니다. 특히 PHP 8.1부터 비동기 기능이 향상되었습니다.

30.1 curl_multi를 사용한 비동기 HTTP 요청

<?php
$urls = [
    "<https://api.example.com/data1>",
    "<https://api.example.com/data2>",
    "<https://api.example.com/data3>"
];

$multiHandle = curl_multi_init();
$curlHandles = [];

// 모든 URL에 대한 curl 핸들 초기화
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

$active = null;
// 비동기 요청 실행
do {
    $status = curl_multi_exec($multiHandle, $active);
    curl_multi_select($multiHandle);
} while ($active && $status == CURLM_OK);

// 결과 수집
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo "응답: " . substr($response, 0, 100) . "...<br>"; // 응답의 처음 100자만 출력
    curl_multi_remove_handle($multiHandle, $ch);
}

curl_multi_close($multiHandle);
?>

설명:

  • curl_multi_init()을 사용하여 여러 HTTP 요청을 비동기적으로 처리합니다.
  • 각 요청에 대해 curl_init()을 초기화하고, curl_multi_add_handle()을 통해 멀티 핸들에 추가합니다.
  • curl_multi_exec()curl_multi_select()을 반복하여 모든 요청이 완료될 때까지 대기합니다.
  • 각 요청의 응답을 수집하고 출력합니다.

30.2 Promiseasync 라이브러리 활용

PHP 8.1부터 비동기 처리를 위한 라이브러리들이 등장했으며, amphp와 같은 라이브러리를 사용하여 비동기 함수를 구현할 수 있습니다.

<?php
require 'vendor/autoload.php';

use Amp\\\\Loop;
use Amp\\\\Http\\\\Client\\\\HttpClientBuilder;

Loop::run(function () {
    $client = HttpClientBuilder::buildDefault();

    $promises = [
        $client->request(new Amp\\\\Http\\\\Client\\\\Request("<https://api.example.com/data1>")),
        $client->request(new Amp\\\\Http\\\\Client\\\\Request("<https://api.example.com/data2>")),
        $client->request(new Amp\\\\Http\\\\Client\\\\Request("<https://api.example.com/data3>")),
    ];

    $responses = yield Amp\\\\Promise\\\\all($promises);

    foreach ($responses as $response) {
        $body = yield $response->getBody()->buffer();
        echo "응답: " . substr($body, 0, 100) . "...<br>";
    }
});
?>

설명:

  • amphp/amp 라이브러리를 사용하여 비동기 HTTP 요청을 처리합니다.
  • Loop::run()을 통해 이벤트 루프를 실행하고, 비동기 요청을 병렬로 처리합니다.
  • 각 요청의 응답을 비동기적으로 수집하고 출력합니다.

참고: 비동기 프로그래밍은 복잡할 수 있으므로, 필요에 따라 적절한 라이브러리를 선택하여 사용하는 것이 좋습니다.


31. PHP 배열 요약

PHP 배열은 다양한 형태로 데이터를 저장하고 관리할 수 있는 강력한 도구입니다. 인덱스 배열, 연관 배열, 다차원 배열 등 다양한 배열 유형을 이해하고, PHP의 풍부한 배열 함수를 활용하면 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 배열을 사용할 때는 가독성을 유지하고, 메모리 사용량을 최적화하며, 보안에 유의하는 것이 중요합니다. 또한, PHP 8.0 이상의 새로운 기능을 활용하면 배열을 더 효과적으로 다룰 수 있습니다.

이 가이드를 통해 PHP 배열의 기본 개념부터 고급 기능까지 이해하고, 실용적인 예제를 통해 실제 프로젝트에 적용해보세요. 잘 설계된 배열 구조는 웹 애플리케이션의 효율성과 확장성을 크게 향상시킬 것입니다.


32. 추가 자료 및 참고 링크


이 가이드를 통해 PHP 배열에 대한 깊은 이해를 얻고, 실용적인 예제를 통해 실제 프로젝트에 적용하는 방법을 익히셨기를 바랍니다. PHP 배열을 효과적으로 활용하여 더욱 강력하고 유연한 웹 애플리케이션을 개발해보세요.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com