Nói chung, tôi nghĩ rằng bạn đang nghĩ sai về mảng kết hợp [không phải "liên kết"]. Thông thường, người ta không sử dụng mảng kết hợp khi thứ tự phần tử mảng cần được đảm bảo. Đây là những gì các mảng được lập chỉ mục bằng số dành cho. Bạn nên cảnh báo rằng PHP không có chức năng tích hợp sẵn để xử lý thứ tự của các mảng kết hợp giống như đối với các mảng được lập chỉ mục bằng số
Bây giờ, nếu bạn cần có các kết hợp khóa-giá trị như bạn trình bày ở đây và có thể hiển thị chúng theo một thứ tự nhất định, có lẽ khi chúng được lặp lại cho đầu ra [đây thực sự là trường hợp sử dụng duy nhất mà tôi có thể nghĩ đến vì lý do tại sao bạn
Trước tiên, bạn có thể tạo một mảng được lập chỉ mục bằng số tham chiếu đến mảng giá trị chính và sử dụng mảng này để lặp lại
Ví dụ
$keyValueArray = ['foo1' => 'bar', 'foo2' => 'buzz', 'foo3' => 'bazz'];
$keyOrder = ['foo1', 'foo2', 'foo3'];
Bây giờ, nếu bạn muốn thay đổi "thứ tự" của các cặp khóa-giá trị, bạn chỉ cần thực hiện việc đó trong mảng $keyOrder
. Và sau đó lặp lại như thế này
foreach[$keyOrder as $key] {
echo $keyValueArray[$key];
}
Ngoài ra, bạn có thể thấy việc xây dựng một mảng các đối tượng [hoặc mảng các mảng kết hợp] sẽ trực quan hơn
$yourArray = [
[object] ['foo1' => 'bar'],
[object] ['foo2' => 'buzz'],
[object] ['foo3' => 'bazz']
];
function placeObjectBeforeByKey[array $arr, string $key, string $before]
{
$keyIdx = null;
$beforeIdx = null;
foreach[$arr as $idx => $obj] {
if[isset[$obj[$key]]] {
$keyIdx = $idx;
}
if[isset[$obj[$before]]] {
$beforeIdx = $idx;
}
if[!is_null[$keyIdx] && !is_null[$beforeIdx]] {
break;
}
}
if[is_null[$keyIdx] || is_null[$beforeIdx]] {
// bad input, perhaps throw exception or log error and return $arr unaltered
}
if[$keyIdx === $beforeIdx] {
// same object had matching keys for both $key and $before
// perhaps throw exception or just return $arr unaltered
return $arr;
}
$keySlice = array_splice[$arr, $keyIdx, 1];
if[$keyIdx < $beforeIdx] $beforeIdx--;
array_splice[$arr, $beforeIdx, 0, $keySlice];
}
Lưu ý rằng về bản chất, một trong hai cách tiếp cận này thực hiện giống như những gì bạn làm trong hàm của mình, khi bạn đang sử dụng array_keys[]
để tạo một mảng mới từ đầu. Sự khác biệt chính so với cách tiếp cận của bạn và các giải pháp thay thế mà tôi đề xuất là bạn minh bạch hơn đối với các vùng mã khác xung quanh cách đạt được thứ tự của các cặp khóa-giá trị cơ bản này. Đối với tôi, nếu tôi là nhà phát triển chọn cơ sở mã của bạn và tôi thấy rằng bạn chỉ đang sử dụng một mảng kết hợp, tôi sẽ không mong đợi điều này ngụ ý bất kỳ thứ tự nào, trong khi nếu bạn đưa cho tôi một mảng đối tượng/mảng hoặc một mảng
Hàm array_shift[] loại bỏ phần tử đầu tiên khỏi một mảng và trả về giá trị của phần tử đã loại bỏ
Ghi chú. Nếu các khóa là số, tất cả các phần tử sẽ nhận được các khóa mới, bắt đầu từ 0 và tăng thêm 1 [Xem ví dụ bên dưới]
âm dài
Đăng ngày 12 tháng 1 năm 2010
âm dài
- Các thành viên
- 75
- Chia sẻ
Đăng ngày 12 tháng 1 năm 2010
Tôi có một mảng kết hợp, vd
array['a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D']
Tôi muốn có thể di chuyển một phần tử từ đầu, giữ nguyên thứ tự của các phần tử khác
vì vậy nếu tôi đặt
$start = 'c';
tôi sẽ lấy
array[ 'c' => 'C', 'a' => 'A', 'b' => 'B','d' => 'D']
Có một cách đơn giản để làm điều này?
[Phiên bản PHP. 5. 2. 10 ]
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
thebadbad
Đăng ngày 12 tháng 1 năm 2010
thebadbad
- Các thành viên
- 1. 6k
- Địa điểm. Đan mạch
- Chia sẻ
Đăng ngày 12 tháng 1 năm 2010
Không thanh lịch lắm, nhưng làm được việc
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
xà lách
Đăng ngày 12 tháng 1 năm 2010
xà lách
- cựu nhân viên
- 1. 8k
- Địa điểm. Edinburg, Scotland
- Chia sẻ
Đăng ngày 12 tháng 1 năm 2010
Đây là một cách khác để làm điều đó
$array = array['a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D']; $new = array['c' => $array['c']] + $array; print_r[$new];
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
âm dài
Đăng ngày 13 tháng 1 năm 2010
âm dài
- Các thành viên
- 75
- Tác giả
- Chia sẻ
Đăng ngày 13 tháng 1 năm 2010
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác