foreach
변수가 있는 루프 를 사용하고 싶지만이 변수는 NULL
예를 들어 다양한 유형이 될 수 있습니다 .
그래서 foreach
테스트 하기 전에 :
if(is_array($var)){
foreach($var as ...
하지만 Iterator
인터페이스 를 구현하는 클래스가 될 수도 있다는 것을 깨달았습니다 . 어쩌면 나는 장님이지만 클래스가 인터페이스를 구현하는지 확인하는 방법은 무엇입니까? is_a
함수 나 inherits
연산자 와 같은 것이 있습니까? 을 찾았습니다 class_implements
. 사용할 수 있지만 더 간단한 것이 있습니까?
두 번째로 더 중요한 것은이 함수가 존재한다고 가정합니다. 변수 is_array
또는 ” Iterator
인터페이스 구현 “인지 확인하기에 충분 할까요? 아니면 더 많은 것을 테스트해야할까요?
답변
foreach
함수 내부에서 사용 중이고 배열 또는 Traversable 객체 가 예상되는 경우 해당 함수에 힌트를 입력 할 수 있습니다.
function myFunction(array $a)
function myFunction(Traversable)
foreach
함수 내에서 사용하지 않거나 둘 다 예상 하는 경우이 구문 을 사용 하여 변수를 반복 할 수 있는지 확인하면됩니다.
if (is_array($a) or ($a instanceof Traversable))
답변
foreach
배열과 객체를 처리 할 수 있습니다. 다음과 같이 확인할 수 있습니다.
$can_foreach = is_array($var) || is_object($var);
if ($can_foreach) {
foreach ($var as ...
}
Traversable
모든 배열과 마찬가지로 모든 객체가 PHP에서 순회 가능하기 때문에 다른 사람들이 답변에서 암시 했으므로 특별히 확인할 필요가 없습니다 .
더 기술적으로 :
foreach
모든 종류의 순회 가능, 즉 배열, 일반 개체 (액세스 가능한 속성이 순회되는 경우) 및Traversable
개체 (또는 내부get_iterator
처리기 를 정의하는 개체 )와 함께 작동 합니다 .
( 출처 )
일반적인 PHP 프로그래밍에서 간단히 말하면 변수가
- 배열
- 객체
그리고 아니다
- 없는
- 자원
- 스칼라
당신은 foreach
그것에 사용할 수 있습니다 .
답변
Traversable
간단한 기능으로 인스턴스를 확인할 수 있습니다 . 이 모든이 작동 것 Iterator
때문에Iterator extends Traversable
function canLoop($mixed) {
return is_array($mixed) || $mixed instanceof Traversable ? true : false;
}
답변
<?php
$var = new ArrayIterator();
var_dump(is_array($var), ($var instanceof ArrayIterator));
반환 bool(false)
또는bool(true)
답변
기능
<?php
/**
* Is Array?
* @param mixed $x
* @return bool
*/
function isArray($x) : bool {
return !isAssociative($x);
}
/**
* Is Associative Array?
* @param mixed $x
* @return bool
*/
function isAssociative($x) : bool {
if (!is_array($array)) {
return false;
}
$i = count($array);
while ($i > 0) {
if (!isset($array[--$i])) {
return true;
}
}
return false;
}
예
<?php
$arr = [ 'foo', 'bar' ];
$obj = [ 'foo' => 'bar' ];
var_dump(isAssociative($arr));
# bool(false)
var_dump(isAssociative($obj));
# bool(true)
var_dump(isArray($obj));
# bool(false)
var_dump(isArray($arr));
# bool(true)
답변
PHP 7.1부터는 iterable
정확히이 목적을위한 의사 유형 이 있습니다. 유형 힌트 iterable
는 모든 배열과 Traversable
인터페이스 구현을 허용합니다 . PHP 7.1도이 기능을 도입했습니다 is_iterable()
. 이전 버전의 경우 새로운 기본 제공 기능없이 동등한 유형 적용을 수행하려면 여기에서 다른 답변을 참조하십시오.
공정한 플레이 : BlackHole이 지적했듯이이 질문은 Iterable 객체와 배열 유형 힌팅 의 중복으로 보입니다 . 그리고 자신의 대답은 나보다 더 세부로 들어갑니다.