2010-09-07 18 views

Odpowiedz

23

Jeśli używasz (np dosłownych) Klawisze własny przypisany array_unshift() to zrobi.
Jeśli używasz kluczy generowanych automatycznie (numerycznych), jak to działa? Użyj "-1" jako nowego pierwszego klucza?

EDIT:
Dziękuję Jasons za wskazanie błędu w tej odpowiedzi.
DOWOLNY klucz numeryczny zostanie ponownie zindeksowany przez array_unshift(), bez względu na to, czy został wygenerowany automatycznie, czy też przypisany samemu sobie - jeśli jest to numeryczny, zostanie zaszyfrowany. Zobacz link do powyższej dokumentacji, aby uzyskać szczegółowe informacje.

+0

nie, ponieważ jeśli indeksy reprezentują identyfikatory w tabeli, nigdy nie będzie zerowego indeksu, więc to działa dobrze w tych sytuacjach – Nicola

+0

@Nicola Przepraszam - ja nie rozumiem, co chcesz mi powiedzieć. –

+0

Mam na myśli, że jeśli zwrócisz wiersze z bazy danych, a kluczami tablicy są identyfikatory wierszy, to tablica nigdy nie będzie mieć klucza 0. Dlatego w tym przypadku sytuacja nie wystąpiłaby, gdy indeks wynosiłby -1. – Nicola

7

Użyj array_unshift(). (Jak wspomniano, będzie przechowywać nienaruszone klucze ciągów, ale nie klucze numeryczne).

+1

"Wszystkie klawisze tablicy numerycznej zostaną zmodyfikowane, aby rozpocząć odliczanie od zera, podczas gdy klawisze literalne nie zostaną dotknięte." (http://www.php.net/array-unshift) –

4

spróbuj tego:

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

Użyj array_unshift(); to pomoże uw dodanie elementu

+0

'array_unshift()' WYKONUJE ponownie indeksować klawisze numeryczne. – Narf

2

tylko szybki notatkę, jeśli chcesz to wykorzystać w pętli ...

Jak stwierdzono tutaj: http://jp2.php.net/manual/en/function.array-unshift.php

array_unshift() wstawia przeszły elementy przód tablicy. Zwróć uwagę, że lista elementów jest traktowana jako całość, dlatego te elementy są w tej samej kolejności. Wszystkie klawisze tablicy numerycznej zostaną zmodyfikowane, aby rozpocząć odliczanie od zera, podczas gdy klawisze literalne nie zostaną dotknięte.

dać wyobrażenie o tym, jak wolno to, pisaliśmy jakiś punkt odniesienia kod (w oparciu o http://pastebin.com/Jad5TjsQ), a oto jak wygląda

[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$ 

Proszę pamiętać, że wszystkie testy są 10 * 10000 , z wyjątkiem array_unshift, który uruchamia 1 * 10 000 (był dość zmęczony czekaniem) ... Więc znowu, nie używaj array_shift w iteracji, ponieważ odwracanie tablicy tylko raz kosztuje prawie nic.

66

Aby uniknąć ponownego indeksowania kluczy numerycznych, można po prostu dodać razem tablice.

Zamiast:

array_unshift($arr1, $arr2) 

try:

$arr1 = $arr2 + $arr1; 
+0

Szukałem, jak zachować klucze numeryczne i wszystko działało świetnie! – rlorenzo

+1

Zawsze odkładałem od dodawania tablic w ten sposób, faworyzując 'array_merge' zamiast tego, ale teraz mam uzasadniony powód, aby go używać. Dzięki! – Benjam

+0

Koncepcja jest prosta – Yaroslav

0

Dobrze, jeśli robisz to, co robię i tworzenia wybierz formę wykorzystywania wyników z DB z indeksów są identyfikatory z DB tabeli, ale chcesz dodać "Any ..." do tablicy z indeksem 0, po prostu najpierw utworzyć zmienną tablicy z tym elementem, a następnie wypełnić pozostałe wartości z bazy danych. Nie ma potrzeby zmiany lub zmiany kolejności po wywołaniu bazy danych.

2

Dodanie własnej (nadmiarowej) odpowiedzi, ponieważ próbowałem edytować Martin's answer, używając jego oryginalnego przykładu, ale zostało odrzucone przez innych (nie Martin). Może nie przejrzeli historii jego odpowiedzi, ponieważ korzystam z jego oryginalnej tablicy przykładów i problemu. Oto moja odrzucona edycja.

Kevin Wentworth's answer jest poprawna. Rozszerzając tę ​​odpowiedź za pomocą oryginalnego przykład z Martin's answer, jeśli masz tablicę

$a = [1 => a, 2 => b, 5 => e, 6 => f, 8 => h, 9 => i]; 

i chcesz wziąć trzy ostatnie elementy i poprzedzić je do tej samej tablicy, a następnie można wykonać następujące czynności.

$a = array_slice($a, -3, null, true) + $a; 

Otrzymany tablica jest

array (6 => 'f', 8 => 'h', 9 => 'i', 1 => 'a', 2 => 'b', 5 => 'e',) 

Uwagi

true argument array_slice konserwy przycisków numerycznych (bez takich parametrów istnieje array_unshift).

Chociaż array_slice nie usuwa niczego z oryginalnej tablicy, z powodu zachowania operatora + na tablicach, ostatnie trzy elementy są anulowane.

Z Dokumenty do Operator + array operator

+ zwraca tablicę prawej dołączony do macierzy po lewej stronie; dla kluczy, które istnieją w obu tablicach, zostaną użyte elementy z lewej tablicy, a pasujące elementy z prawej tablicy zostaną zignorowane.

Powiązane problemy