>  기사  >  백엔드 개발  >  PHP: foreach 및 in_array 사용 예에 ​​대한 자세한 설명

PHP: foreach 및 in_array 사용 예에 ​​대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-06-23 14:42:282159검색

php는 개발에 매우 ​​효율적입니다. 이는 이해할 수 있지만 실행 효율성을 희생합니다. php array는 매우 강력하지만 만약을 대비해 더 많이 고려하고 여러 가지 상황을 시도해야 합니다. 여기서는 앞으로 더 많은 함정을 발견하면 간단히 언급하겠습니다.

1. foreach는 데이터나 객체의 내용을 쉽게 읽을 수 있는 배열 탐색을 제공합니다. 그러나 공식 문서에는 foreach가 내부 배열 포인터에 의존하기 때문에 해당 값이 수정된다고 나와 있습니다. 루프에서 예기치 않은 동작이 발생할 수 있습니다. 따라서 기본적으로
1. 루프 내부의 값을 수정하려고 하지 마세요. 그렇지 않으면 결과가 원하는 것 이상일 것입니다.
2. '&'를 사용하는 것은 거의 사용되지 않지만 안전한 방법입니다. 사용 참조가 끝나면 unset 함수를 즉시 호출하여 변수를 삭제해야 합니다. 그렇지 않으면 다음 코드에서 이 변수를 다시 사용하면 루프의 마지막 값이 수정되어 예기치 않은 값이 생성됩니다. 목록이 루프로 출력되면 출력의 마지막 줄에 지저분한 값이나 null 값이 많이 있을 것입니다. unset을 사용하면 이 문제가 해결됩니다.

예제를 살펴보겠습니다

<?php 
/*-------------------------------------------------------------------------*/ 
/* foreach example 1: value only */ 
echo "foreach example 1: value only ".&#39;<br />&#39;; 
$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 = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);
출력 결과 두 번째 foreach의 출력 결과를 처음 봤을 때 어떻게 두 개의 d_d가 출력될 수 있을까? ㅋㅋㅋ 루프,

두 번째 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 = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
echo $a;
echo &#39;<hr>&#39;;

// 这里 unset 掉
unset($a);

echo $a = &#39;ccc&#39;;
echo &#39;<hr>&#39;;
print_r($arr);
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);

输出结果:

现在就正常了,这些小细节一定要注意了。

위 내용은 PHP: foreach 및 in_array 사용 예에 ​​대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.