Không có sự tương quan giữa các phím chỉ mục số và liên kết.
Khi bạn nói bạn muốn thiết lập giá trị của một mảng kết hợp sử dụng các chỉ số mảng của khóa/giá trị, sau đó bạn phải sử dụng phím nhất định, thiết $array[1]
không giống như thiết $array['foo']
.
Cân nhắc mảng này
print_r(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value'));
này sẽ cung cấp
Array
(
[0] => foo
[foo] => bar
[1] => baz
[some] => value
)
Các foo là yếu tố thứ hai trong mảng. Đó là offset, nhưng nó không liên quan gì đến chỉ mục 1. Như bạn có thể thấy, trong mảng đó ở trên, chỉ mục 1 được liên kết với baz
. Giả sử rằng foo
là khóa kết hợp đầu tiên có liên quan đến khóa số thực tế. Cũng giống như some
không tương quan với 2.
Tương tự, đối với một mảng hỗn hợp như được hiển thị ở trên, giải pháp với array_keys
gợi ý ở những nơi khác trên trang web này sẽ không làm việc, bởi vì
print_r(array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')));
sẽ cho
Array
(
[0] => 0
[1] => foo
[2] => 1
[3] => some
)
vì vậy, khi bạn làm $array[$keys[1]]
bạn đang thực sự làm $array['foo']
. Nhưng nếu bạn muốn truy cập giá trị kết hợp thứ hai trong mảng đó ('some'
), bạn không thể làm $array[$keys[2]]
vì điều đó sẽ đánh giá thành $array[1]
và đó là baz
.
Offset của một nguyên tố là hoàn toàn không liên quan đến nó là chìa khóa hoặc giá trị
print_r(
array(
100 => 'foo',
'foo' => 'bar',
50 => 'baz',
'some' => 'value'
)
);
thực sự có nghĩa
Array
(//key value offset/position
[100] => foo // 0
[foo] => bar // 1
[50] => baz // 2
[some] => value // 3
)
có nghĩa là phần tử tại offset 0 là foo mặc dù nó quan trọng là 100. Nếu bạn muốn trích xuất các phần tử từ một mảng theo độ lệch, bạn phải sử dụng
$third = array_splice($array, 2, 1);
echo $third[0]; // baz
Thi s sẽ tạo một mảng chỉ giữ phần tử ở vị trí thứ ba.
Hoặc bạn có thể sử dụng ArrayIterator
.Các ArrayIterator
thực hiện một giao diện Seekable
cho phép bạn tìm đến một vị trí cụ thể/bù đắp trong mảng và sau đó lấy rằng:
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value
Hoạt động như một sự quyến rũ. Cảm ơn. – Marty
Là một lưu ý phụ, tại sao các nhà phát triển PHP lại tạo ra một cách không trực quan để truy cập một mảng? – Marty
@Marty điều này ít liên quan đến cách các nhà phát triển PHP triển khai nó, nhưng nhiều hơn với sự hiểu lầm của bạn về cách mảng hoạt động. Về mặt kỹ thuật, ở trên vẫn còn sử dụng tên liên kết. Không có sự tương quan giữa các phím chỉ số và các chỉ số liên kết. – Gordon