2009-09-09 20 views
26

cái nào nên được sử dụng để thao tác dữ liệu, mảng hoặc đối tượng mảng? Giống như tìm kiếm, sắp xếp và các thao tác mảng khác.Mảng và mảng PHPObject

+0

Bạn có ví dụ về những gì bạn muốn làm không? – willoller

+0

Tôi cần tìm kiếm, sắp xếp và thao tác phức tạp khác bằng cách sử dụng Array về cơ bản để sử dụng nó trong thuật toán. Vì vậy, tôi cần phải biết cái nào tốt hơn và nhanh hơn. – Imrul

Trả lời

27

Loại cơ bản là array. Đây là bản đồ các khóa và giá trị có thể được ghi vào, đọc từ và truy cập trong một vòng lặp.

ArrayObject là lớp mà bạn có thể mở rộng để tạo các đối tượng hoạt động như thể chúng là mảng. Nó thực hiện các phương thức như countsort cho phép bạn xử lý một đối tượng như bạn sẽ xử lý một mảng. Đó là một phần của SPL (Thư viện PHP chuẩn).

Thông thường bạn sẽ sử dụng array. Bạn sẽ biết khi nào bạn cần ArrayObject.

0

Hầu hết thời gian một mảng là tất cả những gì cần thiết. ArrayObject là hữu ích nhất khi mở rộng cho chức năng trong sử dụng cụ thể.

1

bạn sử dụng array cho đơn giản (và tiêu chuẩn) mảng

ArrayObject là một lớp học, có thể được sử dụng để tăng cường Lớp học của riêng bạn để được sử dụng như mảng (nói một số Bộ sưu tập Lớp của bạn)

+0

ArrayObject không phải là một lớp trừu tượng. – GZipp

+0

oh bạn nói đúng. của tôi xấu, chỉnh sửa – knittl

2

arrayObject chủ yếu là hữu ích khi serialization là cần thiết.

Ngoài ra, bạn có thể tạo lớp bộ sưu tập của riêng mình bằng cách mở rộng arrayObject. Sau đó, bạn có thể tuần tự hóa đối tượng lớp của mình để truyền dữ liệu.

đối với mảng hoạt động đơn giản và thông thường có thể dễ dàng hơn mảng arrayObject.

0

Đối tượng mảng có thể được mở rộng và chức năng được ghi đè. Ví dụ, append của bạn() chức năng có thể định dạng một số với hai chữ số thập phân trước khi gọi cha mẹ :: append()

8

Về mặt hiệu suất, bạn sẽ không nhận thấy một sự khác biệt thực sự giữa một arrayArayObject. Tôi chạy một thử nghiệm đơn giản. Ý tưởng là tạo mảng bằng cách sử dụng mảng() và ArrayObject mới và điền chúng với số lượng giá trị ngày càng tăng.

<?php 
for($i = 0; $i < 2; $i++){ 
    $method = $i == 0 ? 'array' : 'ArrayObject'; 
    for($j = 0; $j < 7 ; $j++){ 
     for($k = 0; $k < 100; $k++){ 
      $max = pow(10,$j); 
      $array = $method == 'array' ? array() : new ArrayObject; 
      $time = explode(' ',microtime()); 
      $sTime = $time[0] + $time[1]; 
      for($l = 0; $l < $max; $l++){ 
       $array[] = 'foo ' . $i . ':' . $j . ':' . $k . ':' . $l; 
      } 
      $time = explode(' ',microtime()); 
      $eTime = $time[0] + $time[1]; 
      $results[$method][$max][] = $eTime - $sTime; 
     } 
    } 
} 
?> 

Kết quả

method    lines  average (µs) difference between methods (µs) 
array     1   2.470   -1.044 
array     10   8.452   +0.315 
array    100   71.862  +10.719 
array    1,000   773.826  +141.962 
array    10,000  7,868.731  -675.359 
array   100,000  76,954.625 -17,665.510 
array   1,000,000  801,509.550 -84,356.148 
ArrayObject   1   3.514   +1.044 
ArrayObject   10   8.137   -0.315 
ArrayObject   100   61.142  -10.719 
ArrayObject  1,000   631.864  -141.962 
ArrayObject  10,000  8,544.090  +675.359 
ArrayObject  100,000  94,620.135 +17,665.510 
ArrayObject 1,000,000  885,865.698 +84,356.148 

trung bình là thời gian trung bình của 100 bài kiểm tra cho từng phương pháp và mỗi số dòng. Sự khác biệt giữa các phương pháp là không đáng kể (84 micro giây khi bạn xử lý một triệu hàng ...)

Tôi đã chạy thử nghiệm này nhiều lần và vì sự khác biệt luôn là một câu hỏi về micro giây, đôi khi một phương pháp hiệu quả hơn trong một bài kiểm tra, sau đó kém hiệu quả trong thời gian thử nghiệm tiếp theo ...

sự lựa chọn sẽ phụ thuộc nhu cầu của bạn:

  • nếu bạn đối phó với mảng đơn giản, và làm một vòng lặp như foreach() hoặc tính toán một trung bình, một array là đủ,
  • nếu bạn cần lặp lại phức tạp hơn, sắp xếp, lọc, ... dễ dàng hơn để mở rộng ArrayObject class bằng trình lặp, phương thức của riêng bạn ...
+7

Xin vui lòng, chỉ định phiên bản của php, nó khá đáng kể. – Astery

+1

Trông với tôi như sự khác biệt là 84 * mili giây * (84 365 * micro giây *) khi bạn đối phó với hàng triệu hàng ... không phải là sự khác biệt có ý nghĩa trong hầu hết các trường hợp. – Erk