배열의 요소를 사용하려면 배열의 위치 지정이 필요합니다. 위치 지정 구현은 배열 포인터의 도움으로 완료되어야 합니다. PHP에는 배열 포인터를 이동하는 많은 함수가 있습니다. 아래에서 몇 가지를 소개하겠습니다.
포인터를 다음 배열 위치로 이동 next()
next() 함수는 현재 배열 포인터 바로 옆에 있는 배열 값을 반환합니다. 형태는 다음과 같습니다.
mixed next(array array)
예는 다음과 같습니다.
$fruits = array("apple", "banana", "orange", "pear"); echo next($fruits); echo next($fruits); // banana // orange
포인터를 앞으로 이동하거나 배열의 시작과 끝으로 직접 이동할 수도 있습니다.
포인터를 이전 배열 위치로 이동 prev()
prev() 함수는 현재 포인터의 이전 위치에 있는 배열 값을 반환합니다. 포인터가 원래 배열의 첫 번째 위치에 있으면 false를 반환합니다. 형태는 다음과 같습니다.
mixed prev(array array)
prev()의 사용법은 next()와 동일하므로 예제는 생략합니다.
포인터를 첫 번째 배열 위치로 이동합니다. Reset()
reset() 함수는 배열 포인터를 배열의 시작 부분으로 다시 설정하는 데 사용됩니다. 형태는 다음과 같습니다.
mixed reset(array array)
이 함수는 스크립트에서 배열을 여러 번 보거나 처리해야 하는 경우에 자주 사용됩니다. 또한 정렬이 끝날 때에도 자주 사용됩니다.
포인터를 마지막 배열 위치로 이동 end()
end() 함수는 포인터를 배열의 마지막 위치로 이동하고 마지막 요소를 반환합니다. 형태는 다음과 같습니다.
mixed end(array array)
다음 예에서는 첫 번째와 마지막 배열 값을 가져오는 방법을 보여줍니다.
$fruits = array("apple", "banana", "orange", "pear"); echo current($fruits); echo end($fruits); // apple // pear
함수 간에 배열이 매개변수로 전달될 때 다음과 같은 규칙이 있습니다. 함수가 호출될 때 시스템은 실제 매개변수의 복사본을 형식 매개변수(참조 호출 제외)에 복사하지만 배열의 경우 , 복사뿐만 아니라 실제 매개변수의 값을 얻고, 실제 매개변수 그룹의 현재 내부 포인터의 위치도 복사됩니다. 실제 매개변수의 내부 포인터 위치가 배열의 끝을 가리키는 경우 시스템은 형식 매개변수 그룹의 첫 번째 단위를 가리키도록 형식 매개변수의 내부 포인터를 재설정합니다. 실제 매개변수가 배열의 끝에 있지 않고 유효한 단위를 가리키면 시스템은 형식 매개변수의 배열 포인터 위치를 실제 매개변수의 배열 포인터와 동일한 값을 가진 배열 단위로 가리킵니다.
$arr['var6'] = 6을 수행하지 않으면 6개 변수($var1-$var6) 모두 값을 가지게 됩니다. 왜냐하면 각 변수 이후에 배열 포인터가 배열의 끝을 가리키고 그 이후에는 func() 함수가 호출되면 시스템은 $arrtmp의 배열 포인터가 첫 번째 요소를 가리키도록 재설정합니다. 그러나 $arr['var6'] = 6 작업 후에는 모든 것이 변경되었습니다. 이 작업은 $arr의 배열 포인터를 NULL을 가리키는 것에서 유효한 값으로 변경했습니다(할당 전후에 배열이 가리키는 주소 단위는 다음과 같습니다). 단지 할당 전에는 해당 주소 단위에 아무것도 없었으나 할당 후에는 6)이 되었다는 점입니다. 이렇게 하면 $arr의 배열 포인터가 유효한 단위를 가리키게 됩니다. func() 함수를 호출하면 시스템은 $arrtmp의 배열 포인터를 재설정하지 않습니다. .. 자신의 마지막 유닛을 가리키며 마찬가지입니다. 각 함수는 현재 배열 포인터의 위치부터 작동하기 시작합니다. 따라서 각 함수 작업의 첫 번째 결과 반환 값은 배열 포인터를 한 비트 더 아래로 이동시키는 $arrtmp 배열의 마지막 요소이므로 while 루프는 여기서 끝납니다. arrtmp ['var5']가 탐색되지 않아 결국 $var1-$var6이 NULL이 됩니다.
배열 할당 과정에서 할당하는 배열과 할당된 배열의 배열 포인터가 변경됩니다. 먼저 결론을 내린 다음 코드를 사용하여 이 결론을 증명합니다. $arrtmp=$arr; 이 할당 표현식에서는 $arr 할당 배열을 호출하고 $arrtmp 할당 배열을 호출합니다. 배열이 할당될 때 할당된 배열의 배열 포인터가 이미 배열의 끝을 가리키는 경우 할당된 배열의 배열 포인터는 할당 후 재설정되고 할당 중에 배열의 첫 번째 요소를 가리킵니다. , 할당된 배열의 배열 포인터는 배열을 가리키지 않습니다. 결국에는 유효한 배열 요소를 가리킵니다. 그러면 할당된 배열의 배열 포인터는 할당 후에 재설정되지 않고 원래 가리킨 요소가 됩니다. 유지됩니다. 할당 후 할당된 배열은 할당된 배열의 값을 가질 뿐만 아니라 할당된 배열의 배열 포인터도 해당 요소를 가리키며 할당된 배열도 자체적으로 동일한 값을 가진 요소를 가리킵니다.
데모1:
<?php $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5); while( list($key,$value) = each($arr) ) { if($value == 4) break; } var_dump(current($arr)); $arr1 = $arr; var_dump(current($arr)); var_dump(current($arr1)); ?>
demo1 的执行结果是:int(5) int(5) int(5) 。从这个结果可以看出,赋值前后$arr的数组指针位置没有发生任何变化,$arr1不仅值跟$arr相同,而且数组指针所指向的元素值也是相同的。现在 用上述结论来解释这个结果,在while循环中,有一个if判断语句,目的是不让$arr的数组指针指向数组末尾,而是保留在一个有效的位置。 在$value=4时会跳出循环,而each这个函数会将数组指针向前移动一位,这就导致了$arr的数组指针指向了第5个元素,所以在赋值之 前,current($arr)的结果是5,赋值之后,由于在赋值之前$arr的当前指针并没有指向末尾,因此在赋值之后不会将$arr的数组指针进行重 置,而是保留了其原有的位置,因此在赋值之后使用current($arr)的结果仍然是5。赋值时$arr1不仅获得了$arr的值,而且数组指针指向 的元素和$arr的相同,二者都是5。
<?php $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5); while( list($key,$value) = each($arr) ) { //if($value == 4) break; } var_dump(current($arr)); $arr1 = $arr; var_dump(current($arr)); var_dump(current($arr1)); ?>
demo2中我们将 if($value == 4) break; 这一句注释掉了,目的很简单,就是通过each将$arr的数组指针位置指向数组末尾。
demo2 的执行结果:bool(false) int(1) bool(false) 。如果数组指针对应的元素为0,"",或者不是一个有效的值时,current函数会返回false,$arr的值中没有为0或者""的情况,因此可以断 定是因为数组指针指向了一个无效的元素而导致current返回了一个false。换句话说就是可以确定在while循环完成之后,$arr的数组指针已 经指向了数组的末尾。所以我们看到在赋值之前current($arr)的值是false,而赋值之后current($arr)的值变成了1,说明赋值 之后$arr的数组指针被重置了,指向了数组的第一个元素。current($arr1)的值为false,说明赋值之后$arr1让然保留了赋值之 前$arr的数组指针指向的元素。
通过demo1和demo2就可以证明上述结论了。
因此为了在遍历数组时不受数组指针的影响,最好在使用each()函数之前或者之后调用函数reset()将数组指针重置。这样就可以避免上述问题的发生了。另外还有一个操作数组指针的函数prev(),它的作用是将数组指针当前的位置后退一位,它也需要注意一点,就是如果数组指针已经指向数组末尾,那么使它就得不到想要的结果了。
顺便说一下foreach这个函数,使用foreach函数来遍历数组时,它会重置数组指针,将其指向数组的第一个元素。必须注意的是foreach操作的对象是对你要遍历的数组的copy值,而不是遍历数组本身。