Cẩn thận với các thuật toán tìm kiếm tuyến tính (ở trên là tuyến tính) trong các mảng nhiều chiều vì chúng có độ phức tạp phức tạp vì độ sâu của nó làm tăng số lần lặp cần thiết để đi qua toàn bộ mảng. Ví dụ:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
sẽ mất tối đa 200 lần lặp để tìm thấy những gì bạn đang tìm kiếm (nếu kim ở mức [100] [1]), với một thuật toán phù hợp.
Các thuật toán tuyến tính trong trường hợp này thực hiện ở O (n) (tổng số phần tử trong toàn bộ mảng), điều này rất kém, một triệu mục (ví dụ: mảng 1000x100x10) sẽ mất trung bình 500.000 lần lặp để tìm kim. Ngoài ra điều gì sẽ xảy ra nếu bạn quyết định thay đổi cấu trúc của mảng đa chiều của bạn? Và PHP sẽ khởi động một thuật toán đệ quy nếu độ sâu của bạn là hơn 100. Khoa học máy tính có thể làm tốt hơn:
Nếu có thể, luôn luôn sử dụng các đối tượng thay vì mảng nhiều chiều:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
và áp dụng một giao diện và chức năng so sánh tùy chỉnh để sắp xếp và tìm thấy chúng:
interface Comparable {
public function compareTo(Comparable $o);
}
class MyObject implements Comparable {
public function compareTo(Comparable $o){
...
}
}
function myComp(Comparable $a, Comparable $b){
return $a->compareTo($b);
}
Bạn có thể sử dụng uasort()
để sử dụng một bộ so sánh tùy chỉnh, nếu bạn cảm thấy thích phiêu lưu, bạn nên triển khai các bộ sưu tập của riêng mình cho các đối tượng có thể sắp xếp và quản lý chúng (tôi luôn luôn mở rộng ArrayObject để bao gồm ít nhất một chức năng tìm kiếm).
$arrayObj->uasort("myComp");
Khi chúng được sắp xếp (uasort là O (n log n), điều này tốt như nó vượt qua dữ liệu tùy ý), tìm kiếm nhị phân có thể thực hiện thao tác trong thời gian O (log n), tức là một triệu mục chỉ mất ~ 20 lần lặp Tìm kiếm. Theo như tôi biết, tìm kiếm nhị phân so sánh tùy chỉnh không được triển khai trong PHP ( array_search()
sử dụng thứ tự tự nhiên hoạt động trên các tham chiếu đối tượng không phải là thuộc tính của chúng), bạn sẽ phải tự thực hiện điều này giống như tôi.
Cách tiếp cận này hiệu quả hơn (không còn độ sâu) và quan trọng hơn là phổ quát (giả sử bạn thực thi khả năng so sánh bằng giao diện) vì các đối tượng xác định cách chúng được sắp xếp, do đó bạn có thể tái chế mã vô hạn. Tốt hơn nhiều =)
$key
không có lỗi trả lời "hiệu quả" nếu không tồn tại trong mảng? Nó sẽ tốt hơn để làm gìif (array_key_exists($key, $array) && $array[$key] == $value) {
?