php는 개발에 매우 효율적입니다. 이는 이해할 수 있지만 실행 효율성을 희생합니다. php array는 매우 강력하지만 만약을 대비해 더 많이 고려하고 여러 가지 상황을 시도해야 합니다. 여기서는 앞으로 더 많은 함정을 발견하면 간단히 언급하겠습니다.
1. foreach는 데이터나 객체의 내용을 쉽게 읽을 수 있는 배열 탐색을 제공합니다. 그러나 공식 문서에는 foreach가 내부 배열 포인터에 의존하기 때문에 해당 값이 수정된다고 나와 있습니다. 루프에서 예기치 않은 동작이 발생할 수 있습니다. 따라서 기본적으로
1. 루프 내부의 값을 수정하려고 하지 마세요. 그렇지 않으면 결과가 원하는 것 이상일 것입니다.
2. '&'를 사용하는 것은 거의 사용되지 않지만 안전한 방법입니다. 사용 참조가 끝나면 unset 함수를 즉시 호출하여 변수를 삭제해야 합니다. 그렇지 않으면 다음 코드에서 이 변수를 다시 사용하면 루프의 마지막 값이 수정되어 예기치 않은 값이 생성됩니다. 목록이 루프로 출력되면 출력의 마지막 줄에 지저분한 값이나 null 값이 많이 있을 것입니다. unset을 사용하면 이 문제가 해결됩니다.
예제를 살펴보겠습니다
<?php /*-------------------------------------------------------------------------*/ /* foreach example 1: value only */ echo "foreach example 1: value only ".'<br />'; $a = array(1, 2, 3, 17); foreach ($a as $v) { echo "Current value of ".$a.":". $v."<br />"; } ?> // 运行结果 foreach example 1: value only Current value of $a: 1 Current value of $a: 2 Current value of $a: 3 Current value of $a: 17
2. in_array,뒤의 배열에 이전 string이 존재하는지 확인한다는 뜻인데, 대부분 이런 식으로 작동합니다. , 그러나 다음 배열이 array(0,1,2,3)과 같은 정수인 경우 문제가 발생합니다. PHP는 이전 문자열을 삽입하여 값 0을 얻습니다. 배열에 이 값이 있으면 방정식이 성립되는 것입니다.
따라서 다음 데이터가 정수라고 판단되면, 특히 0일 수 있는 경우(모든 문자열을 대체할 수 있음) 이 함수를 더 이상 사용해서는 안 됩니다. 대신에 key_exists를 사용할 수 있습니다. array_flip을 사용하여 되돌려야 합니다.
예제를 다시 살펴보겠습니다
function search($keyWord, $stack) {//此处判断是应该更新还是插入 foreach ($stack as $key => $val) { if (in_array($keyWord, $val)) { return TRUE; } } return FALSE; }
문자열을 배열로 사용하여 값을 얻으면 어떻게 되나요? PHP는 내결함성이 매우 뛰어난 언어입니다. 실수를 바로잡도록 최선을 다하므로 참조 첨자를 정수로 현명하게 변환합니다. 그러면 문자열 첨자는 0이고 값은 You입니다. 첫 번째 문자열의 값을 얻게 됩니다. 예상을 뛰어넘는 것인가요? 해결 방법은 아래 첨자 is_array를 참조하기 전에 변수가 배열인지 확인하는 것입니다.
3. foreach에서 변수를 인용할 때 발생하는 문제
저는 수년 동안 PHP를 작성해 왔지만 여전히 어리석은 실수를 저지릅니다. PHP 버전은 5.6.12 코드는 다음과 같습니다. <?php
$arr = ['a', 'b', 'c', 'd', 'e'];
foreach ($arr as $i=>&$a) {
$a = $a.'_'. $a;
echo $a .'<br>';
}
echo '<hr>';
foreach ($arr as $i=>$a) {
echo $a .'<br>';
}
echo '<hr>';
print_r($arr);
두 번째 foreach를 실행할 때 $a가 새 변수가 아니지만 여전히 $arr의 다섯 번째 요소에 대한 주소 참조를 가리킬 때
,
두 번째 foreach가 루핑될 때 실제로는 지속적으로 $arr를 제공하면 배열의 다섯 번째 요소에 값이 할당됩니다.
구체적인 할당 상황은
처음: a_a가 다섯 번째 요소에 할당되고 결과는 다음과 같습니다. [a_a, b_b, c_c, d_d,a_a] 두 번째: b_b가 5번째 요소에 할당되고 결과는 다음과 같습니다. [a_a, b_b, c_c, d_d,b_b]
세 번째: c_c가 5번째 요소에 할당되고 결과는 다음과 같습니다. : [a_a, b_b, c_c, d_d,c_c]네 번째: d_d가 다섯 번째 요소에 할당되고 결과는 다음과 같습니다. [a_a, b_b, c_c, d_d,d_d]
다섯 번째: 이때 , 다섯 번째 요소가 다시 d_d가 되었기 때문에 다섯 번째 요소에 d_d를 다시 할당해도 결과는 여전히 다음과 같습니다. [a_a, b_b, c_c, d_d,d_d]
해결책:
1.尽量不使用相同的循环变量名;
2.每次使用完或再次使用前进行 unset($a); 处理,解除地址应用
还是用上面代码示例:
$arr = ['a', 'b', 'c', 'd', 'e']; foreach ($arr as $i=>&$a) { $a = $a.'_'. $a; echo $a .'<br>'; } echo '<hr>'; echo $a; echo '<hr>'; // 这里 unset 掉 unset($a); echo $a = 'ccc'; echo '<hr>'; print_r($arr); echo '<hr>'; foreach ($arr as $i=>$a) { echo $a .'<br>'; } echo '<hr>'; print_r($arr);
输出结果:
现在就正常了,这些小细节一定要注意了。
위 내용은 PHP: foreach 및 in_array 사용 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!