2011-01-22 30 views
72

Tôi muốn đặt giá trị của một mảng kết hợp bằng cách sử dụng chỉ mục mảng của cặp khóa/giá trị. Ví dụ:Truy cập một mảng kết hợp theo chỉ số nguyên trong PHP

$my_arr = array("bling" => "some bling", "bling2" => "lots O bling"); 
$my_arr[1] = "not so much bling"; // Would change the value with key bling2. 

Làm cách nào để thực hiện điều này mà không sử dụng chuỗi khóa?

Trả lời

155

Sử dụng array_keys.

$keys = array_keys($my_arr); 
$my_arr[$keys[1]] = "not so much bling"; 

Hy vọng điều này sẽ hữu ích.

+2

Hoạt động như một sự quyến rũ. Cảm ơn. – Marty

+3

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

+1

@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

23

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 
1

Một khả năng khác là chuyển đổi nó vào một mảng bình thường:

$ arraybuff = implode ("~~~", $ my_arr);
$ my_arr = explode ("~~~", $ arraybuff);

Trường hợp "~~~" là dấu tách sẽ không xuất hiện trong dữ liệu của bạn.

Bây giờ, bạn có thể truy cập mảng bằng cách sử dụng các chỉ mục bằng số bằng các khoảng bù.

Nếu bạn vẫn cần giữ lại mảng liên kết của mình, chỉ cần gán nó cho một biến khác.

13

Trong khi array_keys() cho phép truy cập vào phím thứ n, array_values sẽ cung cấp cho bạn giá trị thứ n.

<?php 
$array = [ 
    0  => 'Zero', 
    '1' => 'One', 
    'Two' => 'Two', 
]; 
echo array_values($array)[2]; 
?> 

sẽ xuất 'Hai'.

Có lợi thế nào so với cái kia không? Vâng, chỉ một nhỏ tôi có thể thấy là số lượng truy cập mảng.

Với array_keys() bạn cần 3.

  1. Lấy chìa khóa từ mảng dữ liệu.
  2. Lấy phím thứ n từ danh sách các phím.
  3. Lấy giá trị bằng cách sử dụng phím thứ n từ mảng dữ liệu.

Với array_values(), bạn chỉ cần 2.

  1. Lấy giá trị từ mảng dữ liệu.
  2. Lấy giá trị thứ n từ danh sách giá trị.

Nhưng, mặt khác, các phím thường nhỏ hơn và dữ liệu có thể được lồng vào nhau, do đó, trên số dư, sử dụng array_keys() có thể an toàn hơn.

1

Hãy thử điều này. Nó hoạt động cho bạn.

$result= array_values($my_arr); // Array with indexes you need 
+0

Hãy cẩn thận khi đăng bài lên một chuỗi cũ đã có nhiều câu trả lời và câu trả lời được chấp nhận. Bạn cần giải thích tại sao câu trả lời mới của bạn tốt hơn câu trả lời hiện có. – APC

+0

k cảm ơn bạn. @ APC –

1

Nếu mảng lớn, cả array_keysarray_values sẽ lãng phí vì chúng sẽ cấp phát một mảng mới kích thước tương tự như bản gốc, chỉ để có được thứ n chủ chốt (hoặc giá trị).

array_slice chấp nhận giá trị số nguyên và hoạt động trên mảng kết hợp. Bạn có thể sử dụng nó để nhận (và đặt) phím nth trong thời gian không đổi.

// This will at most allocate 2 temporary arrays of 1 element each 
$key = array_keys(array_slice($array, $n, 1, true))[0]; 

$array[$key] = $value; 
Các vấn đề liên quan