수색…


통사론

  • for ($ i = 0; $ i <count ($ array); $ i ++) {incremental_iteration (); }
  • for ($ i = count ($ array) - 1; $ i> = 0; $ i--) {reverse_iteration (); }
  • foreach ($ data as $ datum) {}
  • foreach ($ data => $ datum) {}
  • foreach ($ data as $ datum) {}

비고

배열을 반복하는 메소드의 비교

방법 이점
foreach 배열을 반복하는 가장 간단한 방법입니다.
참조로 foreach 배열의 요소를 반복하고 변경하는 간단한 방법입니다.
for 증분 색인 배열을 자유 순서로 반복 할 수 있습니다. 예 : 여러 요소 건너 뛰기 또는 뒤집기
내부 배열 포인터 더 이상 루프를 사용할 필요가 없습니다 (모든 함수 호출, 신호 수신 등을 한번 반복 할 수 있도록)

여러 배열을 함께 반복

때로는 동일한 길이의 배열 두 개를 함께 반복해야합니다. 예를 들면 다음과 같습니다.

$people = ['Tim', 'Tony', 'Turanga'];
$foods = ['chicken', 'beef', 'slurm'];

array_map 작업을 수행하는 가장 간단한 방법입니다.

array_map(function($person, $food) {
    return "$person likes $food\n";
}, $people, $foods);

출력 할 내용 :

Tim likes chicken
Tony likes beef
Turanga likes slurm

이는 공통 색인을 통해 수행 할 수 있습니다.

assert(count($people) === count($foods));
for ($i = 0; $i < count($people); $i++) {
    echo "$people[$i] likes $foods[$i]\n";
}

두 어레이는 증분 키가없는 경우 array_values($array)[$i] 대체 할 수 $array[$i] .

두 배열의 키 순서가 같은 경우 배열 중 하나에서 foreach-with-key 루프를 사용할 수도 있습니다.

foreach ($people as $index => $person) {
    $food = $foods[$index];
    echo "$person likes $food\n";
}

분리 된 배열은 동일한 길이이고 동일한 키 이름을 가진 경우에만 루프 할 수 있습니다. 즉, 키를 제공하지 않고 숫자가 매겨지면 키가 작을 것입니다. 또는 키의 이름을 지정하고 각 배열에 동일한 순서로 키를 지정하면됩니다.

array_combine 을 사용할 수도 있습니다.

$combinedArray = array_combine($people, $foods);
// $combinedArray = ['Tim' => 'chicken', 'Tony' => 'beef', 'Turanga' => 'slurm'];

그런 다음 앞에서와 동일하게 반복하여 루프 할 수 있습니다.

foreach ($combinedArray as $person => $meal) {
    echo "$person likes $meal\n";
}

증분 인덱스 사용

이 메서드는 0에서 배열의 최대 인덱스까지 정수를 증가시켜 작동합니다.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = 0; $i < count($colors); $i++) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

또한 array_reverse 를 사용하지 않고 역순으로 배열을 반복 할 수 있으므로 배열이 클 경우 오버 헤드가 발생할 수 있습니다.

$colors = ['red', 'yellow', 'blue', 'green'];
for ($i = count($colors) - 1; $i >= 0; $i--) {
    echo 'I am the color ' . $colors[$i] . '<br>';
}

이 방법을 사용하면 쉽게 인덱스를 건너 뛰거나 되감기 할 수 있습니다.

$array = ["alpha", "beta", "gamma", "delta", "epsilon"];
for ($i = 0; $i < count($array); $i++) {
    echo $array[$i], PHP_EOL;
    if ($array[$i] === "gamma") {
        $array[$i] = "zeta";
        $i -= 2;
    } elseif ($array[$i] === "zeta") {
        $i++;
    }
}

산출:

alpha
beta
gamma
beta
zeta
epsilon

점진적인 인덱스를 가지지 않는 배열 (예를 들어, [1 => "foo", 0 => "bar"] , ["foo" => "f", "bar" => "b"] ), 이것은 직접 행해지 지 않습니다. 대신 array_values 또는 array_keys 사용할 수 있습니다.

$array = ["a" => "alpha", "b" => "beta", "c" => "gamma", "d" => "delta"];
$keys = array_keys($array);
for ($i = 0; $i < count($array); $i++) {
    $key = $keys[$i];
    $value = $array[$key];
    echo "$value is $key\n";
}

내부 배열 포인터 사용

각 배열 인스턴스에는 내부 포인터가 들어 있습니다. 이 포인터를 조작하면 배열의 다른 요소를 동일한 호출에서 다른 시간에 검색 할 수 있습니다.

each 사용하기

each() 호출 할 each() 현재 배열 요소의 키와 값을 반환하고 내부 배열 포인터를 증가시킵니다.

$array = ["f" => "foo", "b" => "bar"];
while (list($key, $value) = each($array)) {
    echo "$value begins with $key";
}

next 사용

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (($value = next($array)) !== false) {
    echo "$value\n";
}

이 예제에서는 배열의 요소가 부울 false 동일한 것으로 가정하지 않습니다. 이러한 가정을 방지하려면 key 를 사용하여 내부 포인터가 배열의 끝에 도달했는지 확인하십시오.

$array = ["Alpha", "Beta", "Gamma", "Delta"];
while (key($array) !== null) {
    echo current($array) . PHP_EOL;
    next($array);
}

또한 직접 루프없이 배열을 반복 할 수 있습니다.

class ColorPicker {
    private $colors = ["#FF0064", "#0064FF", "#64FF00", "#FF6400", "#00FF64", "#6400FF"];
    public function nextColor() : string {
        $result = next($colors);
        // if end of array reached
        if (key($colors) === null) {
            reset($colors);
        }
        return $result;
    }
}

foreach 사용하기

직접 루프

foreach ($colors as $color) {
    echo "I am the color $color<br>";
}

열쇠가있는 루프

$foods = ['healthy' => 'Apples', 'bad' => 'Ice Cream'];
foreach ($foods as $key => $food) {
    echo "Eating $food is $key";
}

참조로 루프

위 예제의 foreach 루프에서 값 ( $color 또는 $food )을 직접 수정해도 배열의 값은 변경되지 않습니다. & 연산자는 값이 배열의 요소에 대한 참조 포인터가되도록 필요합니다.

$years = [2001, 2002, 3, 4];
foreach ($years as &$year) {
    if ($year < 2000) $year += 2000;
}

이것은 다음과 유사합니다.

$years = [2001, 2002, 3, 4];
for($i = 0; $i < count($years); $i++) { // these two lines
    $year = &$years[$i];                // are changed to foreach by reference
    if($year < 2000) $year += 2000;
}

동시성

PHP 배열은 반복 과정에서 동시성 문제없이 (Java List 와는 달리) 어떤 방식 으로든 수정할 수 있습니다. 배열을 참조로 반복하면 나중의 반복은 배열을 변경하면 영향을받습니다. 그렇지 않으면 배열의 변경 사항이 이후 반복에 영향을 미치지 않습니다 (대신 배열의 복사본을 반복하는 것처럼). 값순 루프 비교 :

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];
foreach ($array as $key => $value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
    echo "$key => $value\n";
}

산출:

0 => 1
2 => 3
4 => 5
6 => 7

그러나 배열이 참조로 반복되는 경우,

$array = [0 => 1, 2 => 3, 4 => 5, 6 => 7];
foreach ($array as $key => &$value) {
    if ($key === 0) {
        $array[6] = 17;
        unset($array[4]);
    }
    echo "$key => $value\n";
}

산출:

0 => 1
2 => 3
6 => 17

4 => 5 의 키 - 값 세트는 더 이상 반복되지 않으며 6 => 76 => 17 변경됩니다.

ArrayObject 반복자 사용

Php 배열자를 사용하면 배열과 객체를 반복하면서 값을 수정하고 설정을 해제 할 수 있습니다.

예:

$array = ['1' => 'apple', '2' => 'banana', '3' => 'cherry'];

$arrayObject = new ArrayObject($array);

$iterator = $arrayObject->getIterator();

for($iterator; $iterator->valid(); $iterator->next()) {
    echo $iterator->key() . ' => ' . $iterator->current() . "</br>";
}

산출:

1 => apple
2 => banana
3 => cherry


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow