Làm cách nào để thêm phần tử vào phần đầu của mảng mà không thay đổi giá trị khóa mảng trong PHP?Thêm phần tử vào đầu mảng mà không thay đổi các phím mảng khác
Trả lời
Nếu bạn sử dụng các phím (ví dụ theo nghĩa đen) tự giao, array_unshift() sẽ làm điều đó.
Nếu bạn sử dụng các phím được tạo tự động (số), cách thức hoạt động? Sử dụng '-1' làm khóa đầu tiên mới?
EDIT:
Cảm ơn JasonS đã chỉ ra lỗi trong câu trả lời này.
ANY phím số sẽ được lập chỉ mục lại bởi array_unshift()
, bất kể nó được tạo tự động hay tự gán - nếu nó là số, nó sẽ bị xáo trộn. Xem liên kết đến tài liệu ở trên để biết chi tiết.
không vì nếu các chỉ mục đại diện cho các id trong một bảng, sẽ không bao giờ có chỉ mục bằng 0 để nó hoạt động tốt cho các tình huống này – Nicola
@Nicola Tôi xin lỗi - tôi không hiểu những gì bạn đang cố gắng nói với tôi. –
Tôi có nghĩa là nếu bạn trả về các hàng từ một cơ sở dữ liệu và các khóa của mảng là các id hàng, thì một mảng sẽ không bao giờ có một khóa 0. Do đó, trong trường hợp này, một tình huống sẽ không phát sinh khi chỉ số sẽ là -1. – Nicola
Sử dụng array_unshift()
. (Như đã đề cập, nó sẽ giữ nguyên các phím chuỗi của bạn, nhưng không giữ phím số).
"Tất cả các phím mảng số sẽ được sửa đổi để bắt đầu đếm từ số không trong khi các phím chữ sẽ không được chạm vào". (http://www.php.net/array-unshift) –
array_unshift sẽ không sửa đổi các phím không phải là số
thử điều này:
function array_insert(&$array, $insert, $position = -1) {
$position = ($position == -1) ? (count($array)) : $position ;
if($position != (count($array))) {
$ta = $array;
for($i = $position; $i < (count($array)); $i++) {
if(!isset($array[$i])) {
die(print_r($array, 1)."\r\nInvalid array: All keys must be numerical and in sequence.");
}
$tmp[$i+1] = $array[$i];
unset($ta[$i]);
}
$ta[$position] = $insert;
$array = $ta + $tmp;
//print_r($array);
} else {
$array[$position] = $insert;
}
//ksort($array);
return true;
}
Sử dụng array_unshift(); điều này sẽ giúp u trong việc thêm yếu tố
'array_unshift()' S re chỉ mục lại các phím số. – Narf
Chỉ cần ghi chú nhanh vì nếu bạn muốn sử dụng này trong một vòng lặp ...
Như đã trình bày ở đây: http://jp2.php.net/manual/en/function.array-unshift.php
array_unshift() prepends thông qua các yếu tố để mặt trước của mảng. Lưu ý rằng danh sách các phần tử được thêm trước như một tổng thể, sao cho các phần tử được thêm vào vẫn giữ nguyên theo thứ tự. Tất cả các phím mảng số sẽ được sửa đổi để bắt đầu đếm từ số không trong khi các phím chữ sẽ không được chạm vào.
ĐẾN cung cấp cho bạn một ý tưởng về cách chậm này là, chúng tôi đã viết một số mã chuẩn (dựa trên http://pastebin.com/Jad5TjsQ), và đây là cách có vẻ
[email protected]:~/dev/test$ for d in arrayFillBrackets.php arrayFillPush.php arrayFillUnshift.php arrayFillPushReverse.php ; do cat $d; php $d; done
<?php
require "benchmark.php";
function ArrayFillBrackets()
{
$result = array();
for($i = 0; $i < 10000; $i++) $result[] = $i;
return $result;
}
$result = array();
$result[10]['ArrayFillBrackets'] = Benchmark('ArrayFillBrackets', null, 10);
!!! Benchmarking function ArrayFillBrackets for 10 iteration (args:null)...
===================
Results:
===================
time total: 0.02686286
time min: 0.00198293
time max: 0.0058589
time avg: 0.002686286
memory total: 0
memory min: 0
memory max: 0
memory avg: 0
<?php
require "benchmark.php";
function ArrayFillPush()
{
$result = array();
for($i = 0; $i < 10000; $i++) array_push($result, $i);
return $result;
}
$result = array();
$result[10]['ArrayFillPush'] = Benchmark('ArrayFillPush', null, 10);
!!! Benchmarking function ArrayFillPush for 10 iteration (args:null)...
===================
Results:
===================
time total: 0.03958679
time min: 0.003757
time max: 0.00485086
time avg: 0.003958679
memory total: 0
memory min: 0
memory max: 0
memory avg: 0
<?php
require "benchmark.php";
function ArrayFillUnshift()
{
$result = array();
for($i = 0; $i < 10000; $i++) array_unshift($result, $i);
return $result;
}
$result = array();
$result[1]['ArrayFillUnshift'] = Benchmark('ArrayFillUnshift', null, 1);
!!! Benchmarking function ArrayFillUnshift for 1 iteration (args:null)...
===================
Results:
===================
time total: 3.62487912
time min: 3.62487912
time max: 3.62487912
time avg: 3.62487912
memory total: 0
memory min: 0
memory max: 0
memory avg: 0
<?php
require "benchmark.php";
function ArrayFillPushReverse()
{
$result = array();
for($i = 0; $i < 10000; $i++) array_push($result, $i);
return array_reverse($result);
}
$result = array();
$result[10]['ArrayFillPushReverse'] = Benchmark('ArrayFillPushReverse', null, 10);
!!! Benchmarking function ArrayFillPushReverse for 10 iteration (args:null)...
===================
Results:
===================
time total: 0.05071593
time min: 0.00475311
time max: 0.00560999
time avg: 0.005071593
memory total: 108
memory min: 0
memory max: 24
memory avg: 10.8
[email protected]:~/dev/test$
Xin lưu ý rằng tất cả các xét nghiệm là 10 * 10.000 , ngoại trừ array_unshift chạy 1 * 10.000 (đã khá mệt mỏi vì chờ đợi) ... Vì vậy, một lần nữa, không sử dụng array_shift trong iteration, như đảo ngược mảng chỉ một lần chi phí gần như không có gì thay thế.
Để giữ cho các phím số không bị lập lại, bạn có thể chỉ cần thêm các mảng lại với nhau.
Thay vì:
array_unshift($arr1, $arr2)
thử:
$arr1 = $arr2 + $arr1;
Vâng, nếu bạn đang làm những gì tôi đang làm và tạo ra một hình thức lựa chọn sử dụng kết quả từ DB với chỉ số là id từ Bảng DB, nhưng muốn thêm nói "Bất kỳ ..." vào mảng với chỉ mục là 0, chỉ cần tạo biến mảng với mục đó trước, sau đó điền các giá trị còn lại từ cơ sở dữ liệu. Không cần phải unshift hoặc thứ tự các thứ sau khi cuộc gọi cơ sở dữ liệu.
Thêm câu trả lời (dư thừa) của riêng tôi, vì tôi đã cố gắng chỉnh sửa Martin's answer, sử dụng ví dụ ban đầu của mình nhưng đã bị người khác từ chối (không phải Martin). Có lẽ họ không xem lại lịch sử câu trả lời của anh ấy, vì tôi đang sử dụng mảng và vấn đề mẫu ban đầu của anh ấy. Đây là bản chỉnh sửa bị từ chối của tôi.
Kevin Wentworth's answer là chính xác. Mở rộng về câu trả lời rằng việc sử dụng các ví dụ ban đầu từ Martin's answer, nếu bạn có một mảng
$a = [1 => a, 2 => b, 5 => e, 6 => f, 8 => h, 9 => i];
và bạn muốn lấy ba mục cuối cùng và thêm vào trước đó để mảng này cùng, sau đó bạn có thể làm những điều sau đây.
$a = array_slice($a, -3, null, true) + $a;
Mảng kết quả là
array (6 => 'f', 8 => 'h', 9 => 'i', 1 => 'a', 2 => 'b', 5 => 'e',)
Ghi chú
Các true
lập luận để bảo tồn array_slice
phím số (không có tham số như vậy tồn tại cho array_unshift
).
Mặc dù array_slice
không xóa bất kỳ thứ gì từ mảng ban đầu, do hành vi của toán tử +
trên mảng, ba mục cuối cùng bị hủy.
Từ các tài liệu cho + array operator
Toán tử + trả về mảng bên phải nối vào mảng bên trái; đối với các khóa tồn tại trong cả hai mảng, các phần tử từ mảng bên trái sẽ được sử dụng và các phần tử phù hợp từ mảng bên phải sẽ bị bỏ qua.
- 1. thêm phần tử vào mảng ruby trả về mảng mới
- 2. Cách thay thế các phần tử trong mảng bằng các phần tử của mảng khác
- 3. Thêm phần tử vào phần tử cuối cùng của mảng
- 4. Thêm các phần tử của một mảng
- 5. jQuery - thêm các phần tử vào một mảng
- 6. Làm thế nào để thêm một phần tử vào mảng và thay đổi chỉ mục?
- 7. Cách quan sát thêm phần tử vào mảng
- 8. xoá phần tử đầu tiên khỏi mảng
- 9. thay đổi theo dõi ko.com đã quy đổi của các phần tử của mảng
- 10. Serialize mảng mà không cần phần tử gốc
- 11. thay đổi mảng ban đầu bên trong vòng lặp foreach?
- 12. thay đổi các phím mảng trong hàm array_walk?
- 13. khác biệt Tính giữa các phần tử mảng
- 14. C# linq - lấy các phần tử từ mảng không tồn tại trong một mảng khác nhau
- 15. Thuật toán Javascript để tìm các phần tử trong mảng không nằm trong mảng khác
- 16. Thêm chuỗi vào đầu mảng String
- 17. thay thế các phần tử chéo trong một mảng
- 18. Các phần tử mảng tham chiếu PHP
- 19. C - phần tử nằm ngoài phần đầu của một mảng
- 20. Thêm phần tử vào đầu phần tử nhóm
- 21. Tại sao SimpleXML thay đổi mảng của tôi thành phần tử đầu tiên của mảng khi tôi sử dụng?
- 22. Các mảng đầu vào HTML
- 23. Thêm mảng vào mảng hiện có mà không cần gọi một khóa mới
- 24. Xử lý các mảng của các phần tử đầu vào HTML với Request.Form Giống như PHP
- 25. thay đổi giá trị của các phần tử mảng từ bên trong một hàm
- 26. mảng json: Cách tạo các phần tử mảng mới?
- 27. Nhận tất cả các phần tử, nhưng phần tử đầu tiên từ một mảng
- 28. perl thêm các phần tử giả vào mảng sau khi yêu cầu
- 29. Ghép mảng Javascript mà không thay đổi chỉ mục
- 30. Làm mờ các phần tử vào và ra mà không thay đổi bố cục của trang
Cách thức hoạt động? Điều gì sẽ xảy ra nếu bạn có một mục có khóa '0'? –
Bạn có thể đưa ra một ví dụ với một mảng đầu vào và đầu ra bạn cần –