2010-09-07 36 views

Trả lời

23

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.

+0

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

+0

@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. –

+0

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

7

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ố).

+1

"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) –

4

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; 
    } 
0

Sử dụng array_unshift(); điều này sẽ giúp u trong việc thêm yếu tố

+0

'array_unshift()' S re chỉ mục lại các phím số. – Narf

2

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ế.

66

Để 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; 
+0

Đã xem xét cách giữ các phím số và điều này thật tuyệt vời! – rlorenzo

+1

Tôi đã luôn tránh xa việc thêm mảng theo cách này, ưu tiên 'array_merge' thay vào đó, nhưng bây giờ tôi có lý do chính đáng để sử dụng nó. Cảm ơn! – Benjam

+0

Khái niệm rất đơn giản – Yaroslav

0

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.

2

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.

Các vấn đề liên quan