2012-04-13 54 views
9

Là một lập trình viên PHP, tôi sử dụng các mảng cho tất cả mọi thứ. Tôi biết SPLFixedArray có thể hữu ích trong một số trường hợp nhất định và tôi biết PHP arrays aren't very memory efficient, nhưng tôi hiếm khi gặp phải các trường hợp thực tế nơi họ đấu tranh để làm những gì tôi cần.Các đặc tính của loại mảng của PHP là cấu trúc dữ liệu là gì?

Điều này trái ngược với khi tôi làm việc trong Java, nơi tôi thấy nó hoàn toàn quan trọng là tôi hiểu chính xác cấu trúc dữ liệu tôi đang sử dụng, và ưu và khuyết điểm của mỗi cấu trúc. Nếu ai đó đề nghị tôi chỉ sử dụng LinkedHashMap cho mọi thứ trong Java, họ sẽ bị cười ra khỏi tòa nhà.

Vậy làm thế nào chúng ta có thể thoát ra với kỹ thuật nhanh và lỏng lẻo như vậy trong PHP? Các chi tiết cụ thể cơ bản của mảng PHP là gì? Nó thường được mô tả là "một bản đồ có thứ tự", nhưng điều đó khiến rất nhiều việc thực hiện còn lại để đầu cơ.

Một số trường hợp sử dụng Mảng PHP là đặc biệt tốt ở? Một số trường hợp sử dụng dường như thẳng về phía trước có vẻ là các mảng PHP thực sự là khá xấu tại? Ví dụ: tôi giả sử có một số loại xử lý tốt hơn các mảng có khóa số nguyên dày đặc (ví dụ: $arr = array('a','b','c','d','e');) so với bản đồ băm được đặt hàng, nhưng sau đó ranh giới giữa mật độ dày đặc và thưa thớt ở đâu? Do mảng trở nên kém hiệu quả hơn ngay khi tôi giới thiệu ngay cả một khóa không được đặt hàng, chẳng hạn như $arr[10] = 'f';? Điều gì về $arr[1000000] = 'g';? Tôi giả sử PHP không cư trú ~ 1 triệu khe cắm inbetween, nhưng nếu đó là một danh sách liên kết dưới nắp, sau đó có lẽ gọi $arr[rand()] = rand(); nhiều lần sẽ phải làm một số sắp xếp lại sau mỗi chèn?

Bất kỳ câu trả lời nào khám phá các chi tiết cơ bản của mảng PHP đều được chào đón, ngay cả khi nó không giải quyết các câu hỏi cụ thể mà tôi nêu ra.

+1

Vì không ai mong PHP hoạt động tốt? –

+0

Trên thực tế, [không có sắp xếp lại liên quan] (http://codepad.org/V0Y9K9MZ). Khi bạn gán cho một khóa không tồn tại, nó sẽ được đặt ở cuối mảng. – Ryan

+6

Tôi ngạc nhiên vũ trụ đã không khởi động lại sau khi một người nào đó sử dụng 'PHP' và' strengths' trong cùng một câu. –

Trả lời

1

Các vấn đề cơ bản với mảng PHP là họ là một mash-up của hai loại dữ liệu khác nhau: mảng và bản đồ. Mảng a la Javascript hoặc Python là các danh sách đơn giản, có thứ tự, được lập chỉ mục số bắt đầu từ 0. Rất dễ hiểu và dễ sử dụng. Bản đồ (còn gọi là từ điển) là các bộ sưu tập các cặp khóa-giá trị. Một lần nữa, rất đơn giản để hiểu và sử dụng.

PHP mảng có thể được cả hai, và hành động như cả hai, tùy thuộc vào những gì bạn làm với họ, và một số hoạt động sử dụng các hàm mảng PHP có thể làm cho chúng cư xử theo những cách bất ngờ. Các khóa mảng có thể là các chuỗi hoặc số nguyên, nhưng bạn không thể có một khóa chuỗi là số, cho PHP sẽ buộc phải chuyển đổi nó thành một số nguyên bất kể bạn làm gì. Điều này có thể tạo ra các vấn đề khi (ví dụ) chuyển đổi dữ liệu sang và từ JSON, bởi vì bạn có thể kết thúc với nhiều khóa số tương tự của các loại khác nhau.

Nhà phát triển của PHP phải giữ hai loại dữ liệu riêng biệt. Có thể thuận tiện khi sử dụng ký hiệu mảng để tạo bản đồ trực tiếp, nhưng chúng không nên thực hiện nó. Tôi không phải là một fan hâm mộ lớn của Python (... nhưng) nhưng sự khác biệt chính thức giữa các danh sách và bản đồ là một điều họ chắc chắn đã làm tốt hơn so với PHP.

1

Mảng PHP thật tuyệt vời khi lập mô hình tọa độ không gian tùy ý. Bạn khá dễ dàng tạo ra một bộ nhớ cache của các giá trị tiếng ồn perlin - tích cực, tiêu cực, và vv.

Mảng PHP rất phù hợp để thể hiện các đối tượng cấu hình. Các loại khóa linh hoạt giúp việc này trở nên dễ dàng.

Mảng PHP gây nhầm lẫn cho bạn về sự khác biệt giữa khóa và chỉ mục. Rất tệ.

Mảng PHP thường chỉ chậm hơn - mặc dù nó có thể là chính PHP và không thực sự là mảng - và luôn cung cấp cho bạn nhiều tùy chọn hơn bạn thực sự cần. Nó dẫn đến câu hỏi khủng khiếp như thế này:

PHP: Best way to iterate two parallel arrays?

Chỉ cần nhìn vào mảng của mình. Chúng ... chúng là gì? Danh sách tham số tùy ý?

Ngoài ra, một mảng php khác cũng rất tuyệt!

$class->call('func', Array(..params..)); 
+0

Tôi đã hy vọng để có được một chút thảo luận nhiều hơn đi về các cấu trúc dữ liệu cơ bản, nhưng nhờ đầu vào của bạn. – dimo414

+0

@ dimo414 Vậy tại sao bạn lại chấp nhận người trả lời? – k0pernikus

+0

Bạn không nhận được thêm phản hồi nào sau hơn 6 tháng. Sẽ loại bỏ nếu bạn nghĩ rằng tôi sẽ nhận được nhiều hơn. – dimo414

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