Câu hỏi Truy cập một mảng kết hợp theo chỉ số nguyên trong PHP


Tôi muốn thiết lập 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ụ:

$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 thế nào điều này có thể được thực hiện điều này mà không cần sử dụng chuỗi khóa?


76
2018-01-22 16:52


gốc




Các câu trả lời:


Sử dụng array_keys.

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

Hi vọng điêu nay co ich.


162
2018-01-22 16:54



Làm việc như một say mê. Cảm ơn. - Marty
Như một lưu ý phụ, tại sao các nhà phát triển PHP lại tạo ra cách truy cập một mảng không trực quan như vậy? - Marty
@ Marty này có ít hơn để làm với cách PHP devs thực hiện nó, nhưng nhiều hơn với sự hiểu lầm của bạn về cách mảng làm việc. 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
Bạn tạo một mảng kết hợp bởi vì những gì bạn đang tìm kiếm là quan trọng hơn vị trí của nó trong mảng. Tôi nghĩ đây là một điểm tốt. Giả sử bạn có một mảng với tên sinh viên là khóa và địa chỉ làm giá trị. Bạn có thể đến địa chỉ của học sinh theo tên của nó. Vị trí của mảng không liên quan. Và bạn có thể sắp xếp mảng theo name of the student. - Donovan
@Albert bạn đang ánh xạ số này tới chuỗi khóa thích hợp. Điều đó không có nghĩa là array[1] === $array['foo'] Tuy nhiên. Mảng vẫn có thể chứa một giá trị khác tại $array[1]. Lưu ý rằng tôi không nói rằng giải pháp của bạn là sai. Đó là giả định của OP. - Gordon


Không có sự tương quan giữa các phím chỉ số và các chỉ số liên kết.

Khi bạn nói bạn muốn đặt giá trị của mảng kết hợp bằng chỉ mục mảng của khóa / giá trị, sau đó bạn phải sử dụng khóa, cài đặt đã cho $array[1] không giống như cài đặt $array['foo'].

Xem xét mảng này

print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );

Điều này sẽ cho

Array
(
    [0] => foo
    [foo] => bar
    [1] => baz
    [some] => value
)

Foo là phần tử thứ hai trong mảng. Đó là bù lại, 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. Có thể giả định rằng chỉ vì foo là khóa kết hợp đầu tiên nó có liên quan đến khóa số thực tế 1. Giống như some không tương quan với 2.

Tương tự như vậy, đố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 được đề xuất ở nơi khác trên trang web này sẽ không hoạt động, 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 thực sự đang 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 được $array[$keys[2]] bởi vì điều đó sẽ đánh giá $array[1] và đó là baz.

Bù đắp của một phần tử hoàn toàn không liên quan đến khóa hoặc giá trị của nó

print_r(
    array(
        100    => 'foo',
        'foo'  => 'bar',
        50     => 'baz',
        'some' => 'value'
    )
);

Thực sự có nghĩa là

Array
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)

có nghĩa là phần tử ở offset 0 là foo mặc dù khóa của nó 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

Điều này sẽ tạo ra 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 Seekable giao diện cho phép bạn tìm kiếm một vị trí / khoảng trống cụ thể trong mảng và sau đó tìm nạp:

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

24
2018-01-22 17:22





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 ra 'Hai'.

Có một lợi thế của một trong những khác? 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 phải 3.

  1. Lấy chìa khóa từ mảng dữ liệu.
  2. Lấy khóa 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 các giá trị từ mảng dữ liệu.
  2. Lấy giá trị thứ n từ danh sách các 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 đó, về sự cân bằng, sử dụng array_keys() có lẽ an toàn hơn.


14
2017-07-01 11:29





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

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

Trong đó "~~~" là dấu phân cá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 offset.

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


1
2018-01-16 20:46





Thử cái này. Nó hoạt động cho bạn.

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

1
2017-12-23 07:24



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
k cảm ơn bạn @ APC - Murali krishna


Nếu mảng lớn, cả hai array_keys và array_values sẽ lãng phí vì họ sẽ phân bổ một mảng mới có cùng kích thước với bản gốc, chỉ để có được thứ n khóa (hoặc giá trị).

array_slice chấp nhận một số nguyên bù đắp và hoạt động trên mảng kết hợp. Bạn có thể sử dụng nó để lấy (và đặt) thứ n chính 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;

1
2017-10-03 12:40