PHP는 배열이 비어 있는지 확인합니다. 어느 것이 더 효율적인가요?
仅有的幸福
仅有的幸福 2017-05-16 12:58:57
0
4
863

isset 개수가 비어 있음

仅有的幸福
仅有的幸福

모든 응답(4)
刘奇

isset은 배열이 비어 있는지 확인할 수 없습니다

나머지 두 개: http://stackoverflow.com/ques...

결론은 개수보다 비어 있는 것이 더 효율적이라는 것입니다

仅有的幸福

결론만 말씀드리자면, 비어 있는 것이 가장 효율적입니다.

count는 먼저 배열의 길이를 세고 판단해야 합니다.

일부 답변에서 이것이 잘못된 것이라고 지적했습니다

저는 항상 카운트의 시간 복잡도가 O(n)이라고 생각했습니다. 이번에 뺨을 맞고 원본 코드를 읽어보니 실제로는 O(1)이었습니다.

카운트 소스 코드 링크

count 함수는 배열에서 작동합니다.

으아아아

php_count_recursive 작업을 살펴보고 배열에 대한 php_count_recursive 함수의 작업을 살펴보겠습니다. cnt = zend_hash_num_elements(Z_ARRVAL_P(array));

zend_hash_num_elements 코드:

으아아아

isset은 변수가 정의되었는지 또는 NULL 값이 있는지 여부만 감지할 수 있습니다.
변수가 먼저 정의되면 !$array는 비어 있는 것과 같습니다. 효율성도 동일합니다.

Peter_Zhu

isset 판단할 수 없으면 대답하지 않겠습니다. 이것은 PHP의 기본 지식입니다.
다음은 주로 empty 및 count 차이 isset不能判断我就不回答了,这是PHP基础知识,看手册去
下面主要讲emptycount的区别

根据PHP的源代码(PHP5.4)

typedef struct _HashTable
{
    int size;
    int elem_num;
    Bucket** buckets;
} HashTable;

在实现中,不论是empty,还是count,都是取的zVal - value指向的HashTable结构中的elem_num

其它答案中的,说count需要计算长度,拜托,PHP会那么傻?还傻乎乎的跑一遍链表,count会直接返回数组的elem_num

结论

所以两者之间的判断方式是没任何差距的empty就是执行了elem_num <= 0,既然两者都是执行相同底层代码,但是不代表执行速度一样。

速度差异

根据http://stackoverflow.com/ques...中的测试结果来看(测试结果在下方),大家会发现count的确要比empty慢一点,也许大家会疑惑,既然都是判断的elem_num,那么为什么会慢?

为什么慢

根据PHP的手册:

对empty的解释有一行:

因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

所以结果很明显了:count是函数,empty却是一个语言构造器
既然是语言构造器,那执行效率是肯定比函数高的,比如echo也是语言构造器

比如 echo 'str1','str2';的效率就比 echo 'str1'.'str2';高,更不用说print

PHP 소스코드(PHP5.4) 기준

으아악 구현 시 empty 또는 count인지 여부에 관계없이 zVal - value가 가리키는 HashTable이 사용됩니다. . elem_num 구조

다른 답변에서는 count가 길이를 계산해야 한다고 합니다. PHP가 그렇게 멍청할 수 있나요? 어리석게 연결된 목록을 다시 실행하면 count는 배열의 elem_num

을 직접 반환합니다. 결론

🎜따라서 두 가지 판단 방법 사이에는 차이가 없습니다🎜, emptyelem_num <= 0을 실행하는 것입니다. 둘 다 동일한 기본 코드를 실행하기 때문입니다. 실행 속도가 동일하다는 의미입니다. 🎜 🎜속도차🎜 🎜http://stackoverflow.com/ques...의 테스트 결과에 따르면(테스트 결과는 아래에 있음) count가 실제로 empty보다 느리다는 것을 알 수 있습니다. > 한 가지, 모두 elem_num으로 판단되는데 왜 느린 걸까요? 🎜 🎜왜 느린가요🎜 🎜PHP 매뉴얼에 따르면: 🎜 🎜비어 있음을 설명하는 줄이 있습니다: 🎜 🎜함수가 아닌 언어 생성자이기 때문에 변수 함수로 호출할 수 없습니다. 🎜 🎜결과는 분명합니다. count는 함수이지만 empty언어 생성자입니다.
언어이기 때문입니다. 생성자 는 함수보다 실행 효율성이 확실히 높습니다. 예를 들어 echo언어 생성자입니다. 🎜 🎜예를 들어 echo 'str1','str2';print는 말할 것도 없고 echo 'str1'.'str2';보다 더 효율적입니다. 코드 > 🎜 🎜🎜하지만🎜 OpCache나 JIT를 사용한 후에는 둘 다 최적화되었기 때문에 둘 사이에 차이가 없습니다(아래 참조). 🎜 🎜네이티브 PHP🎜 으아악 🎜JIT(또는 HipHop VM) 사용🎜 으아악
阿神

우선 연관배열이 아니라면 isset이 더 효율적이고 비어있는 배열이 주로 사용됩니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿