수색…
통사론
- 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 => 7
은 6 => 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