Ai đó có thể giải thích rõ ràng sự khác biệt cơ bản giữa ArrayIterator
, ArrayObject
và Array trong PHP về chức năng và hoạt động? Cảm ơn!Sự khác biệt giữa ArrayIterator, ArrayObject và Array trong PHP
Trả lời
Có thể bạn sẽ tìm thấy câu trả lời của bạn ở đây:
iterator này cho phép để unset và sửa đổi các giá trị và các phím trong khi iterating trên Mảng và các đối tượng.
Khi bạn muốn để lặp qua mảng nhiều lần cùng bạn cần để nhanh chóng ArrayObject và để cho nó tạo trường hợp ArrayIterator tham chiếu đến nó, hoặc bằng cách sử dụng foreach hoặc bằng cách gọi phương pháp của nó getIterator() bằng tay.
Cũng đọc:
Xin lỗi tôi đã không làm rõ câu hỏi của tôi - Có Tôi đã đọc tài liệu PHP trên ba nhưng có vẻ như với tôi giống như họ làm khá nhiều điều tương tự. Tôi đã tự hỏi liệu có ai đó có thể giải thích sự khác biệt thực sự giữa họ và lý do tại sao bạn chọn cái kia. Nếu đây không phải là câu hỏi phù hợp để đăng ở đây thì tôi xin lỗi và xin vui lòng xóa bài đăng này! – jkhamler
Array
là một loại php bản địa. Bạn có thể tạo một trang bằng ngôn ngữ php xây dựng array()
, hoặc như của php 5.4 trở đi []
ArrayObject
là một object
mà làm việc giống hệt như mảng. Chúng có thể được tạo bằng cách sử dụng new
từ khóa
ArrayIterator
giống như ArrayObject
nhưng có thể tự lặp lại. Cũng tạo ra sử dụng new
So sánh Array
vs (ArrayObject
/ArrayIterator
)
Cả hai đều có thể được sử dụng bằng cú pháp mảng của php, cho ví dụ.
$array[] = 'foo';
$object[] = 'foo';
// adds new element with the expected numeric key
$array['bar'] = 'foo';
$object['bar'] = 'foo';
// adds new element with the key "bar"
foreach($array as $value);
foreach($object as $value);
// iterating over the elements
Tuy nhiên, họ vẫn còn các đối tượng vs mảng, do đó bạn sẽ nhận thấy sự khác biệt trong
is_array($array); // true
is_array($object); // false
is_object($array); // false
is_object($object); // true
Hầu hết các chức năng php mảng mong đợi mảng, vì vậy sử dụng đối tượng thì sẽ ném lỗi. Có rất nhiều chức năng như vậy. Ví dụ:
sort($array); // works as expected
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......
Cuối cùng, đối tượng có thể làm những gì bạn mong chờ từ một đối tượng stdClass
, ví dụ: truy cập vào tài sản công cộng sử dụng cú pháp đối tượng
$object->foo = 'bar'; // works
$array->foo = 'bar'; // Warning: Attempt to assign property of non-object in ....
Mảng (là loại có nguồn gốc) được nhanh hơn nhiều so với các đối tượng.Ở phía bên kia, các ArrayObject
& ArrayIterator
lớp đã phương pháp nhất định được xác định mà bạn có thể sử dụng, trong khi không có điều như vậy đối với các mảng
So sánh ArrayObject
vs ArrayIterator
Sự khác biệt chính giữa 2 nằm trong các phương thức mà các lớp có.
Giao diện ArrayIterator
thực hiện giao diện Iterator
cung cấp các phương thức liên quan đến lặp/lặp qua các phần tử. ArrayObject
có một phương thức được gọi là exchangeArray
hoán đổi nội bộ của nó với một phương thức khác. Việc thực hiện một điều tương tự trong ArrayIterator
có nghĩa là tạo một đối tượng mới hoặc lặp qua các phím & unset
ing tất cả từng cái một & rồi đặt các phần tử từ mảng mới một lần.
Tiếp theo, vì không thể lặp lại ArrayObject
, khi bạn sử dụng nó trong foreach
, nó tạo đối tượng ArrayIterator
nội bộ (giống như mảng). Điều này có nghĩa là php tạo một bản sao của dữ liệu gốc & hiện có 2 đối tượng có cùng nội dung. Điều này sẽ chứng minh là không hiệu quả đối với mảng lớn. Tuy nhiên, bạn có thể chỉ định lớp nào sẽ sử dụng cho trình vòng lặp, do đó bạn có thể có các trình vòng lặp tùy chỉnh trong mã của mình.
Hy vọng điều này hữu ích. Các chỉnh sửa cho câu trả lời này được hoan nghênh.
Giải thích là về arrayIterator là tất cả sai. Đọc câu trả lời của tôi. – David
ArrayObject và mảng có phần giống nhau. Chỉ đơn thuần là một tập hợp các đối tượng (hoặc các kiểu gốc). Họ có một số phương pháp khác nhau mà bạn có thể gọi, nhưng nó chủ yếu là sôi xuống đến cùng một điều.
Tuy nhiên, một Iterator là một thứ hoàn toàn khác. Mẫu thiết kế của trình vòng lặp là một cách để bảo đảm mảng của bạn (làm cho nó chỉ đọc được). Cho phép lấy ví dụ tiếp theo:
Bạn có một lớp có một mảng. Bạn có thể thêm các mục vào mảng đó bằng cách sử dụng addSomethingToMyArray. Tuy nhiên, lưu ý rằng chúng ta thực hiện điều gì đó cho mục trước khi chúng ta thực sự thêm nó vào mảng. Điều này có thể là bất cứ điều gì, nhưng cho phép một lúc hành động như nó là rất quan trọng là phương pháp này được bắn cho MỌI mục mà chúng tôi muốn thêm vào mảng.
class A
{
private $myArray;
public function returnMyArray()
{
return $this->myArray;
}
public function addSomethingToMyArray($item)
{
$this->doSomethingToItem($item);
array_push($item);
}
}
Vấn đề với điều này, là bạn chuyển mảng theo tham chiếu tại đây. Điều đó có nghĩa rằng các lớp thực sự sử dụng returnMyArray nhận được đối tượng myArray thực. Điều đó có nghĩa là các lớp khác ngoài A có thể thêm các thứ vào mảng đó và cũng thay đổi mảng bên trong A mà không cần phải sử dụng addSOmethingToMyArray. Nhưng chúng ta cần phải làm như vậy, hãy nhớ? Đây là một ví dụ về một lớp không kiểm soát trạng thái bên trong của nó.
Giải pháp cho điều này là một trình lặp. Thay vì truyền mảng, chúng ta chuyển mảng tới một đối tượng mới, mà chỉ có thể đọc những thứ từ mảng đó. Iterator đơn giản nhất bao giờ là một cái gì đó như thế này:
<?php
class MyIterator{
private $array;
private $index;
public function __construct($array)
{
$this->array = $array;
}
public function hasNext()
{
return count($this->array) > $this->index;
}
public function next()
{
$item = $this->array[ $this->index ];
this->$index++;
return $item;
}
}
?>
Như bạn thấy, tôi không có cách nào thêm các mục mới vào mảng nào đó, nhưng tôi không có posibilities để đọc các mảng như thế này:
while($iterator->hasNext())
$item = $iterator->next();
Bây giờ có nữa là, chỉ có một cách để thêm các mục vào myArray trong A, cụ thể là thông qua phương thức addSomethingToArray. Vì vậy, đó là những gì một Iterator, nó là một phần của một vỏ xung quanh mảng, để cung cấp một cái gì đó gọi là đóng gói.
array
là một trong tám loại nguyên thủy trong PHP. Mặc dù nó đi kèm với rất nhiều chức năng tiện ích tích hợp, nhưng tất cả chúng đều là thủ tục.
Cả hai ArrayObject
và ArrayIterator
cho phép chúng tôi tạo mảng cho công dân hạng nhất trong chương trình hướng đối tượng (OOP).
Sự khác nhau giữa ArrayObject
và ArrayIterator
là, kể từ khi thực hiện giao diện ArrayIterator
SeekableIterator
, bạn có thể làm $myArray->seek(10);
với ArrayIterator
.
An Iterator là một đối tượng cho phép lập trình viên duyệt qua vùng chứa, đặc biệt là danh sách. Các loại trình vòng lặp khác nhau thường được cung cấp qua giao diện của vùng chứa.
Không có nhiều khác biệt giữa ArrayObject
và Array
vì chúng đại diện cho cùng một điều mặc dù sử dụng các loại đối tượng khác nhau.
ArrayIterator
là Iterator lặp lại trên Array-like
đối tượng, điều này bao gồm tất cả các đối tượng triển khai ArrayAcess
và kiểu gốc Array
. Trong thực tế, khi bạn foreach
trên một mảng, PHP trong nội bộ tạo ArrayIterator
để làm traversing và biến đổi mã của bạn để trông như thể gõ này,
for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator-
>next())
{ $key = $arrayIteartor->key();
$value = $arrayIterator->current();
}
Vì vậy, bạn có thể thấy, mỗi đối tượng bộ sưu tập có một Iterator trừ các bộ sưu tập đã xác định của bạn mà bạn cần phải xác định các bộ lặp của riêng bạn.
- 1. Sự khác biệt giữa Array.length = 0 và Array = []?
- 2. Sự khác biệt giữa Array.slice và Array() slice
- 3. Sự khác nhau giữa int [] array và int array []
- 4. Sự khác biệt đáng kể trong Array vs Array List?
- 5. Sự khác biệt về PHP giữa mảng() và []
- 6. Có sự khác biệt nào giữa! == và! = Trong PHP không?
- 7. Sự khác biệt giữa float và double trong php?
- 8. Sự khác biệt giữa. và #
- 9. Sự khác biệt giữa $ (...) và `...`
- 10. Sự khác biệt giữa = và: =
- 11. Sự khác biệt giữa $ * và $ @
- 12. Sự khác biệt về PHP giữa shuffle và array_rand
- 13. Sự khác biệt về PHP giữa int và số nguyên
- 14. Sự khác biệt giữa ". +" Và ". +?"
- 15. Sự khác biệt giữa "**/* /" và "** /"?
- 16. Sự khác biệt giữa __construct() và init()
- 17. Sự khác biệt về PHP giữa Curl và HttpRequest
- 18. sự khác biệt giữa PHP base64_encode và * nix base64
- 19. Sự khác biệt giữa ByteArray và Array <Byte> trong kotlin
- 20. Sự khác biệt giữa '.' và "." trong java
- 21. Sự khác biệt giữa. và: trong Lua
- 22. sự khác biệt giữa 'và "trong JavaScript?
- 23. Sự khác biệt giữa! và !! trong yaml?
- 24. Sự khác biệt giữa $ @ và $! trong perl
- 25. Sự khác biệt giữa apc_add và apc_store?
- 26. Sự khác biệt giữa Enum.GetValues và Enum.GetNames
- 27. Sự khác biệt giữa% 5B% và% 5B0%?
- 28. Sự khác biệt giữa Symfony và Silex
- 29. Sự khác biệt giữa jquery và $
- 30. Tính toán sự khác biệt giữa ngày/giờ trong PHP
Bạn đã đọc [ArrayIterator] (http://www.php.net/ArrayIterator), [ArrayObject] (http://www.php.net/ArrayObject) và [Array] (http: // www. php.net/Array)? Đó có lẽ là tất cả thông tin bạn cần. – vascowhite
Ngoài ra, [Stackoverflow không phải là trợ lý nghiên cứu cá nhân của bạn] (http://meta.stackexchange.com/a/128553/164367) – vascowhite