Ottieni il primo elemento di un array


1072

Ho un array:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

Vorrei ottenere il primo elemento di questo array. Risultato atteso: stringa apple

Un requisito: non può essere fatto con il passaggio per riferimento , quindi array_shiftnon è una buona soluzione.

Come posso fare questo?


1
Cosa vuoi dire, non si può fare per riferimento?
cjk

La funzione non dovrebbe funzionare usando &$arraycome parametri.
hsz

4
Ho il sospetto che ciò che "realmente" intendi con "non può essere fatto per riferimento", è che l'array viene restituito in modo dinamico da un database e non vuoi passare l'array in una variabile prima di prendere il primo elemento da. Se ho ragione, la stragrande maggioranza di tutte le soluzioni fornite di seguito (compresa la risposta accettata), sono insufficienti.
cartbeforehorse,

Devi solo ottenerlo o scaricarlo e rimuoverlo dall'array esistente?
Jo Smo,

Per un utilizzo di base degli array, puoi consultare questo link technofusions.com/introduction-to-arrays-in-php
Vikrant Vir Bhalla,

Risposte:


1369

Risposta originale, ma costosa (O (n)):

array_shift(array_values($array));

In O (1):

array_pop(array_reverse($array));

Altri casi d'uso, ecc ...

Se la modifica (nel senso di reimpostazione dei puntatori di array) di $arraynon è un problema, è possibile utilizzare:

reset($array);

Questo dovrebbe essere teoricamente più efficiente, se è necessaria una "copia" di array:

array_shift(array_slice($array, 0, 1));

Con PHP 5.4+ (ma potrebbe causare un errore di indice se vuoto):

array_values($array)[0];

77
+1 per la soluzione alternativa intelligente per impedire la modifica dell'array originale con array_values ​​()
ChrisR

44
Ottengo questo: <b> Standard rigorosi </b>: solo le variabili devono essere passate per riferimento. Bella soluzione alternativa
Simone

191
Non è un po 'eccessivo? Cosa succede se l'array contiene diverse migliaia di elementi? È giustificato creare un array completamente nuovo solo per ottenere il suo primo elemento? list()e reset()sono soluzioni molto più belle secondo me.
Martin Dimitrov,

33
Sono d'accordo. Overkill totale e risorse straordinarie pesanti rispetto a una riga che reimposta e restituisce il valore corrente: reset ($ array);
Zmonteca,

48
-1 Come hanno detto i commentatori sopra. Mi sorprende che questo abbia 101 voti.
Razze di leggerezza in orbita

790

Come ha sottolineato Mike (il modo più semplice possibile):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"

Se si desidera ottenere la chiave: (eseguirla dopo il ripristino)

echo key($arr); // Echoes "4"

Dalla documentazione di PHP :

reset misto (array e $ array );

Descrizione:

reset () riavvolge il puntatore interno dell'array al primo elemento e restituisce il valore del primo elemento dell'array o FALSE se l'array è vuoto.


Sebbene venga passato per riferimento per reimpostare, l'array originale non viene modificato. Immagino che sia il motivo per cui hsz non vuole passarlo per riferimento ..?
Dennis Jamin,

10
L'iteratore dell'array viene modificato. Se lo fai in a foreachcon l'array del soggetto, lo rovinerai.
Zenexer,

2
@Zenexer questo non è sempre (di solito) vero. Di solito, in pratica, foreachcopierà l'array che sta eseguendo il ciclo.
Luke Cousins,

1
@Angger dopo il reset, puoi chiamare key($arr)e otterrai '4' (aggiunto nella risposta)
lepe

3
Né @Zenexer né Luke Cousins ​​hanno ragione: 1) foreach non usa il puntatore internat di un array - invece crea il proprio puntatore. È facile controllare il reset delle chiamate all'interno di foreach - il loop seguirà la sua strada senza alcun effetto da reset(). 2) No, foreach NON crea una copia di un array !!! Crea solo il proprio puntatore (nemmeno una copia di uno esistente - è anche facile da controllare, chiamando next()prima di foreach).
dmikam,

278
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

2
In realtà non l'ho provato, ma sembra che questo approccio sia il più efficiente.
mason81,

4
L'unico problema è la domanda posta per il valore, non la chiave. Quindi corrente ($ array) dovrebbe essere usato al posto della chiave ($ array)
zmonteca

4
@zmonteca $ first_value = reset ($ array); qui ottieni il valore, la funzione reset () riavvolge le matrici puntatore interno e restituisce il primo elemento.
S3Mi

1
la migliore risposta! stava cercando l'equivalenza chiave () per ottenere il primo valore. Questo aiuta!
Alain Tiemblo,

98
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

Se non si desidera perdere la posizione corrente del puntatore, è sufficiente creare un alias per l'array.


1
non capito, cosa intendi? Funziona bene se la chiave della prima è più grande delle altre.
yoda,

29
+1 FYI reset()restituisce già il primo elemento, quindi non è necessario utilizzare current()- echo reset($arr)dovrebbe bastare
Mike

@ Mike, ma si potrebbe preferire currentper resetevitare PHP avviso / errore prodotto nei casi di riferimento, ad esempio current(array_filter(...));in 3v4l .
CPHPython,

91

current($array)può procurarti il ​​primo elemento di un array, secondo il manuale di PHP .

Ogni array ha un puntatore interno al suo elemento "corrente", che viene inizializzato sul primo elemento inserito nell'array.

Quindi funziona fino a quando non si riposiziona il puntatore dell'array, altrimenti si dovrà reimpostare l'array.


4
Non so perché questa non sia stata la risposta accettata, in quanto risponde alla domanda in modo abbastanza semplice e preciso.
ricaduta il

26
current($array)funzionerà solo se il puntatore dell'array punta "attualmente" al primo elemento, altrimenti reset($array)sarebbe necessario.
Jon

6
Sembra che current()non richieda più un riferimento, anche se i documenti PHP non lo riflettono. Quindi penso che questa sia diventata la soluzione migliore.
Ryan,

@Ryan è d'accordo, ma questa soluzione è stata data 2 anni prima del 2014 in questa altra risposta di questo stesso thread ... Strano che questa frase incompleta abbia ottenuto più voti.
CPHPython

70

È possibile ottenere l'ennesimo elemento con un costrutto di linguaggio, "elenco":

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

Con la array_keysfunzione puoi fare lo stesso per i tasti:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);

2
Questo è esattamente quello che faccio: secondo list($first_value) = $my_array;me l'opzione migliore. Non ha i problemi delle altre risposte presentate qui: nessun "overkill" perché non copia o l'array o ne crea uno nuovo. Nessun "riferimento": l'array non viene modificato. No "reset": nessuna modifica al puntatore interno dell'array ...
J. Bruni

6
Soluzione molto elegante, ma genera un E_NOTICE quando l'array è vuoto.
Tgr

1
@Mike sì, ma poi non è più così elegante :)
Tgr

13
Non è sbagliato ?! Funziona solo se le chiavi dell'array lo sono int, prova a fare list($firstItem) = array('key1' => 'value1');e otterrai un erroreNotice: Undefined offset: 0
Marco Demaio

12
Per chiarire: list($x) = foo();è equivalente a $x = foo()[0];. Si noti che questo non è necessariamente lo stesso di "get the first item", poiché anche un array con indice intero potrebbe non avere un elemento con chiave 0. Nel mio caso stavo facendo "list ($ order) = get_order ($ user) ;" ma "get_order" stava restituendo gli ordini digitati dal loro ID, che di solito non era 0. Come dice @Sergiy, array_values ​​() risolve questo problema, ma toglie l'efficienza e (soprattutto) la leggibilità del codice.
Warbo,

55

PHP 5.4+:

array_values($array)[0];

Questo è per le persone fantastiche che gestiscono le ultime e le più grandi. ;)
Zenexer,

1
Ha modificato la sua risposta nell'ottobre 2013 per includere la mia risposta che ho aggiunto ad aprile.
Samer Ata,

PHP 4:$array_values = array_values($array); $value = $array_values[0];
zdick,

38

PHP 7.3 aggiunto due funzioni per ottenere la prima e l'ultima chiave di un array direttamente senza modifiche dell'array originale e senza creare alcun oggetto temporaneo:

Oltre ad essere semanticamente significative, queste funzioni non spostano nemmeno il puntatore di array (come foreach farebbe).

Avendo le chiavi, si possono ottenere direttamente i valori dalle chiavi.


Esempi (tutti richiedono PHP 7.3+)

Ottenere la prima / ultima chiave e valore:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

Ottenere il primo / ultimo valore come una riga, supponendo che l'array non possa essere vuoto :

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

Ottenere il primo / ultimo valore come una riga, con valori predefiniti per array vuoti:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

Accorciare con un operatore a coalescenza nulla , di solito null è predefinito quindi: $first_value = $my_array[array_key_first($my_array)] ?? null;
Mitchell McKenna

29

Supponiamo che:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

Usa solo:

$array[key($array)]

per ottenere il primo elemento o

key($array)

per ottenere la prima chiave.

Oppure puoi scollegare il primo se vuoi rimuoverlo.


9
Cosa non usare semplicemente currentallora?
Marco Demaio,

27

Alcuni array non funzionano con funzioni come list, resetocurrent . Forse sono array "falsi", ad esempio implementando parzialmente ArrayIterator.

Se si desidera estrarre il primo valore indipendentemente dall'array, è possibile cortocircuitare un iteratore:

foreach($array_with_unknown_keys as $value) break;

Il tuo valore sarà quindi disponibile in $value e il ciclo si interromperà dopo la prima iterazione. Questo è più efficiente della copia di un array potenzialmente grande in una funzione come array_unshift (array_values ​​($ arr)).

Puoi anche prendere la chiave in questo modo:

foreach($array_with_unknown_keys as $key=>$value) break;

Se lo chiami da una funzione, torna semplicemente in anticipo:

function grab_first($arr) {
    foreach($arr as $value) return $value;
}

Suppongo che questo sia uno dei modi più veloci perché usare il costrutto del linguaggio foreach piuttosto che una funzione chiamata (che è più costoso). designcise.com/web/tutorial/…
Ildar Amankulov il

19

Dagli aiutanti di Laravel :

function head($array)
{
    return reset($array);
}

L'array viene passato per valore alla funzione, il reset () influenza il puntatore interno di una copia dell'array e non tocca l'array originale (nota che ritornafalse se l'array è vuoto).

Esempio di utilizzo:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

Inoltre, ecco un'alternativa. È molto più veloce, ma più interessante. Consente di modificare facilmente il valore predefinito se l'array è vuoto:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

Per la cronaca, ecco un'altra mia risposta , per l'ultimo elemento dell'array.


17

Mantieni questo semplice! Ci sono molte risposte corrette qui, ma per ridurre al minimo tutta la confusione, questi due funzionano e riducono molte spese generali:

key($array)ottiene la prima chiave di un array
current($array)ottiene il primo valore di un array


EDIT: per
quanto riguarda i commenti qui sotto. Verrà visualizzato il seguente esempio:string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));

11
Uhh. currentè uguale all'elemento corrente. È necessario reimpostare il puntatore all'inizio dell'array per assicurarsi che sia effettivamente all'inizio.
waterloomatt,

current () otterrà l'elemento corrente, non il primo elemento. È diverso.
Amirhossein Tarmast

current funzionerà se nell'array è presente un solo elemento.
Zameer Fouzan,


14

Lo farei echo current($array).


1
@hsz Non importa, current()non si sbaglia quando si passano i non-riferimenti. A condizione che il puntatore sia ancora all'inizio funziona.
Dan Lugg,

ma produce un avviso che rende i tuoi tronchi sporchi e bene ... dovresti sbarazzarti anche degli avvisi se non sono critici
dmikam

1
@dmikam no non lo è. In realtà resetproduce l'avviso "Solo le variabili devono essere passate per riferimento" mentre currentno: Esempio dell'editor PHP online dicurrent(array_filter(...)); .
CPHPython

@CPHPython, sembra che tu abbia ragione ... sembra che io abbia avuto questa idea di corrente dai vecchi tempi di PHP 4 dove produce davvero un errore fatale: sandbox.onlinephpfunctions.com/code/… L'unico problema che vedo nell'uso di corrente è che non garantisce che l'elemento restituito sia il primo elemento di un array (il puntatore interno può essere modificato dalla funzione chiamata). Praticamente può restituire un elemento casuale di un array.
dmikam,

1
@CPHPython Esempio artificiale po ', ma dimostra anche il mio pensiero: sandbox.onlinephpfunctions.com/code/... solo immaginare che si riceve l'array da qualche funzione che utilizza next(), end()o di qualsiasi altra funzione che modifica puntatore interno dell'array. Nel mio esempio, current()restituisce null perché il puntatore interno è "fuori intervallo" dell'array. Ma può anche "virtualmente" indicare qualsiasi elemento / casuale.
dmikam,

13
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

Produzione:

apple

10
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

Non sono andato come descritto nella risposta accettata.
Ho

9
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

Questo è molto più efficiente rispetto al array_values()fatto che la each()funzione non copia l'intero array.

Per maggiori informazioni vedi http://www.php.net/manual/en/function.each.php


because the each() function does not copy the entire array.+1

2
Ma la cosa è che dovresti fare un reset prima, se il puntatore interno non è all'inizio non otterrai il primo elemento.
Carlos Goce,

Ognuno () riceve un array per riferimento e il requisito delle domande iniziali non è quello di farlo
dmikam

8

Un modo kludgy è:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

3
Almeno sei onesto - è kludgy! Ma funziona e l'ho usato in passato fino a quando non ho imparato la tecnica list () sopra.
random_user_name

1
In questo caso, è possibile utilizzare reset()anche il puntatore di matrice che viene ripristinato prima di foreachessere chiamato comunque.
Tyzoid,

7

Ottieni il primo elemento:

array_values($arr)[0]

Ottieni l'ultimo elemento

array_reverse($arr)[0]

I tasti numerici vengono conservati con array_reverse, in modo da restituire comunque il primo elemento. 3v4l.org/2729s
Non

7

Molti di questi funzionano! MA per una chiamata rapida a linea singola (risorsa bassa):

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

Anche se funziona, e discretamente bene, per favore vedi anche la mia risposta aggiuntiva: https://stackoverflow.com/a/48410351/1804013


5
Ciò equivale all'utilizzo current($array), il che richiede che il puntatore interno dell'array si trovi comunque sul primo elemento, nel qual caso echo reset($array)è più appropriato.
Tyzoid,

@Tyzoid ha effettivamente scritto un'altra risposta qui con il tuo suggerimento , ma ha omesso la tua spiegazione ... Grazie.
CPHPython

@Tyzoid: Ho fatto una risposta / aggiornamento aggiuntivo per un po 'andare: stackoverflow.com/a/48410351/1804013
TFont

5

Penso che usare array_values sia la soluzione migliore qui. È possibile restituire il valore all'indice zero dal risultato di quella funzione per ottenere 'apple'.


5

Questo è un po 'tardi per il gioco, ma mi è stato presentato un problema in cui il mio array conteneva elementi array come bambini al suo interno, e quindi non potevo semplicemente ottenere una rappresentazione in forma di stringa del primo elemento array. Usando la current()funzione di PHP , ho gestito questo:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

Grazie a tutte le soluzioni attuali mi hanno aiutato ad arrivare a questa risposta, spero che questo aiuti qualcuno a volte!


4

Uso:

$first = array_slice($array, 0, 1);  
$val= $first[0];

Per impostazione predefinita, array_slicenon conserva le chiavi, quindi possiamo tranquillamente utilizzare zero come indice.


4

Due soluzioni per te.

Soluzione 1: basta usare il tasto. Non hai detto che non puoi usarlo. :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

Soluzione 2 - array_flip () + key ()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

Soluzione 3 - array_keys ()

echo $array[array_keys($array)[0]];

2

Questa non è una risposta così semplice nel mondo reale. Supponiamo di avere questi esempi di possibili risposte che puoi trovare in alcune librerie.

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

Come puoi vedere, abbiamo diverse soluzioni "a una linea" che funzionano bene in alcuni casi, ma non in tutti.

Secondo me, dovresti avere quell'handler solo con array.

Ora parlando di prestazioni, supponendo che abbiamo sempre array, in questo modo:

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shiftè più veloce di reset, cioè più veloce di [count () - 1], e questi tre sono più veloci di array_valuese array_slice.


2

Immagino che l'autore stesse solo cercando un modo per ottenere il primo elemento di un array dopo averlo ottenuto da una funzione ( mysql_fetch_row , ad esempio) senza generare un STRICT "Solo le variabili devono essere passate per riferimento".

In tal caso, quasi tutti i modi qui descritti riceveranno questo messaggio ... e alcuni di essi utilizzano molta memoria aggiuntiva per duplicare un array (o parte di esso). Un modo semplice per evitarlo è semplicemente assegnare il valore in linea prima di chiamare una di queste funzioni:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

In questo modo non viene visualizzato il messaggio STRICT né sullo schermo né nei registri e non si creano array aggiuntivi. Funziona con array indicizzati E associativi .


1

Mi piace l'esempio "list", ma "list" funziona solo sul lato sinistro di un compito. Se non vogliamo assegnare una variabile, saremmo costretti a creare un nome temporaneo, che nella migliore delle ipotesi inquina il nostro ambito e nel peggiore dei casi sovrascrive un valore esistente:

list($x) = some_array();
var_dump($x);

Quanto sopra sovrascriverà qualsiasi valore esistente di $ x, e la variabile $ x rimarrà attiva fintanto che questo ambito è attivo (la fine di questa funzione / metodo, o per sempre se siamo al livello superiore). Questo può essere aggirato usando call_user_func e una funzione anonima, ma è goffo:

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

Se utilizziamo funzioni anonime come questa, possiamo effettivamente cavarcela con reset e array_shift, anche se usano il pass-by-reference. Questo perché la chiamata di una funzione vincolerà i suoi argomenti e questi argomenti possono essere passati per riferimento:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

Tuttavia, questo è in realtà eccessivo, poiché call_user_func eseguirà questa assegnazione temporanea internamente. Questo ci consente di trattare le funzioni pass-by-reference come se fossero pass-by-value, senza avvisi o errori:

var_dump(call_user_func('reset', array_values(some_array())));

1

Una piccola modifica a ciò che Sarfraz ha pubblicato è:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

1

Non mi piace armeggiare con il puntatore interno dell'array, ma è anche inefficiente costruire un secondo array con array_keys()o array_values(), quindi di solito lo definisco:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.