2009-03-31 34 views
116

Hãy xem xét những ví dụ 2 ...Điều gì sẽ nhanh hơn và tốt hơn để xác định xem một khóa mảng tồn tại trong PHP?

$key = 'jim'; 

// example 1 
if (isset($array[$key])) { 
    // ... 
} 

// example 2  
if (array_key_exists($key, $array)) { 
    // ... 
} 

Tôi muốn biết nếu một trong hai trong số này là tốt hơn. Tôi đã luôn luôn sử dụng đầu tiên, nhưng đã thấy rất nhiều người sử dụng ví dụ thứ hai trên trang web này.

Vì vậy, điều nào tốt hơn? Nhanh hơn? Mục đích rõ ràng hơn?

+1

Bạn có thực sự * đã thử * nhanh hơn không? – Tomalak

+0

Tôi chưa chạy bất kỳ điểm chuẩn nào, không. Tôi có nên có trước khi yêu cầu? – alex

+4

'isset' sẽ không bao giờ hoạt động chính xác như' array_key_exists', ví dụ mã được cho là làm cho nó hoạt động giống hệt một thông báo nếu khóa không tồn tại. – deceze

Trả lời

157

isset() là nhanh hơn, nhưng nó không giống như array_key_exists().

array_key_exists() hoàn toàn kiểm tra xem khóa có tồn tại hay không, ngay cả khi giá trị là NULL.

Trong khi isset() sẽ trả lại false nếu khóa và giá trị tồn tại là NULL.

+0

Bạn có xác định quyền sở hữu tài nguyên cụ thể nhanh hơn không? –

+0

Tôi cũng tìm thấy 'thay thế' nhanh hơn là 'issset() 'bằng một biên độ đáng kể (20-50%). Xem http://juliusbeckmann.de/blog/php-benchmark-isset-or-array_key_exists.html, http://www.php.net/manual/en/function.array-key-exists.php#82867 hoặc http : //www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/. Tuy nhiên, cần lưu ý rằng isset() trả về false nếu khóa tồn tại nhưng giá trị là NULL. –

1

Để "nhanh hơn": Dùng thử (số tiền của tôi là array_key_exists(), nhưng tôi không thể dùng thử ngay bây giờ).

Như để "rõ ràng hơn trong mục đích": array_key_exists()

+3

isset() thực sự nhanh hơn đáng kể nếu bạn không quan tâm đến hành vi rỗng (xem http://www.randombenchmarks.com/?p=29). –

5

có sự khác biệt .. từ php.net bạn sẽ đọc:

isset() không trả về TRUE cho mảng phím tương ứng với giá trị NULL, trong khi array_key_exists() thực hiện.

Một thử nghiệm rất thân mật cho thấy array_key_exists() là chậm hơn khoảng 2,5 lần so với isset()

16

Vâng, điểm khác biệt chính là isset() sẽ không trả lại true cho các khóa mảng tương ứng với giá trị null, trong khi array_key_exists() thực hiện.

Chạy small benchmark cho thấy rằng isset() nhanh hơn nhưng có thể không hoàn toàn chính xác.

+1

Bạn có thể chạy lại điểm chuẩn với chính xác hơn không "(mảng isset ($ array [$ i]) || $ [$ i] === null)"? – Tomalak

+0

Ồ, và bạn có đăng một dấu hiệu cho thấy sự khác biệt về hiệu suất của hai biến thể này không? Cảm ơn! – Tomalak

+0

Bạn có cân nhắc bỏ qua các dòng '$ arraykeyexists_result []' không? Điều đó không liên quan trong trường hợp này. – Gumbo

0

Rõ ràng ví dụ thứ hai rõ ràng hơn trong ý định, không có câu hỏi về nó. Để tìm ra ví dụ số 1, bạn cần phải làm quen với các biến idiosyncracies khởi tạo biến của PHP - và sau đó bạn sẽ tìm ra rằng nó hoạt động khác nhau cho các giá trị null, và cứ thế.

Khi mà là nhanh hơn - Tôi không có ý định suy đoán - chạy hoặc trong một vòng lặp chặt chẽ một vài trăm ngàn lần trên phiên bản PHP của bạn và bạn sẽ tìm ra :)

-1

Mã của bạn, isset($array[$i]) || $array[$i] === null, sẽ trả về true trong mọi trường hợp, ngay cả khi khóa không tồn tại (và mang lại một thông báo chỉ mục không xác định).Đối với hiệu suất tốt nhất những gì bạn muốn là if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}

+0

Đây là câu trả lời cho nhận xét của Tomalak về http://stackoverflow.com/a/700264/632951 – Pacerier

+0

Thời gian duy nhất '$ array [$ i] === null' sẽ được thực hiện là khi $ i tồn tại trong mảng và có giá trị NULL .. –

21

Nếu bạn quan tâm đến một số xét nghiệm tôi đã thực hiện thời gian gần đây:

https://stackoverflow.com/a/21759158/520857

Tóm tắt:

| Method Name        | Run time    | Difference 
========================================================================================= 
| NonExistant::noCheckingTest()   | 0.86004090309143  | +18491.315775911% 
| NonExistant::emptyTest()     | 0.0046701431274414 | +0.95346080503016% 
| NonExistant::isnullTest()    | 0.88424181938171  | +19014.461681183% 
| NonExistant::issetTest()     | 0.0046260356903076 | Fastest 
| NonExistant::arrayKeyExistsTest()  | 1.9001779556274  | +209.73055713% 
2

Kết hợp isset()is_null() cho hiệu suất tốt nhất so với các chức năng khác như: array_key_exists(), isset(), isset() + array_key_exists(), is_null(), isset() + is_null(), vấn đề duy nhất ở đây là hàm sẽ không chỉ trả về false nếu khóa không tồn tại, mà ngay cả khóa tồn tại và có giá trị rỗng.

Benchmark kịch bản:

<?php 
    $a = array('a' => 4, 'e' => null) 

    $s = microtime(true); 
    for($i=0; $i<=100000; $i++) { 
    $t = (isset($a['a'])) && (is_null($a['a'])); //true 
    $t = (isset($a['f'])) && (is_null($a['f'])); //false 
    $t = (isset($a['e'])) && (is_null($a['e']));; //false 
    } 

    $e = microtime(true); 
    echo 'isset() + is_null() : ' , ($e-$s)."<br><br>"; 
?> 

Credit: http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/

5

tôi muốn thêm 2 cent của tôi về vấn đề này, vì tôi đã mất tích một cách trung ra.

Như đã nói isset() sẽ đánh giá giá trị của khóa vì vậy nó sẽ trở false nếu giá trị đó là null nơi array_key_exists() sẽ chỉ kiểm tra xem phím tồn tại trong mảng.


Tôi đã chạy một chuẩn mực đơn giản sử dụng PHP 7, kết quả cho thấy là thời gian mất để hoàn thành lặp:

$a = [null, true]; 

isset($a[0])       # 0.3258841 - false 
isset($a[1])       # 0.28261614 - true 
isset($a[2])       # 0.26198816 - false 

array_key_exists(0, $a)     # 0.46202087 - true 
array_key_exists(1, $a)     # 0.43063688 - true 
array_key_exists(2, $a)     # 0.37593913 - false 

isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true 
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true 
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false 

array_key_isset(0, $a)     # 1.17933798 - true 
array_key_isset(1, $a)     # 0.70253706 - true 
array_key_isset(2, $a)     # 1.01110005 - false 

Tôi đã thêm các kết quả từ chức năng tùy chỉnh này với điều này điểm chuẩn cũng sẽ hoàn thành:

function array_key_isset($k, $a){ 
    return isset($a[$k]) || array_key_exists($k, $a); 
} 

như đã thấy và đã nói với isset() là fas phương pháp thử nhưng nó có thể trả về false nếu giá trị là null. Điều này có thể cho kết quả không mong muốn và thường là một trong những nên sử dụng array_key_exists() nếu đó là trường hợp.

Tuy nhiên, có cách giữa và đang sử dụng isset() || array_key_exists(). Mã này thường sử dụng chức năng nhanh hơn isset()nếuisset() trả về false chỉ sau đó sử dụng array_key_exists() để xác thực. Thể hiện trong bảng trên, nó chỉ nhanh như gọi một cách rõ ràng isset().

Có, viết nhiều hơn một chút và gói nó trong một hàm sẽ chậm hơn nhưng dễ dàng hơn rất nhiều. Nếu bạn cần điều này cho hiệu suất, kiểm tra dữ liệu lớn, vv viết nó ra đầy đủ, nếu không nếu sử dụng một thời gian của nó mà rất nhỏ trên không chức năng array_key_isset() là không đáng kể.

Các vấn đề liên quan