2010-03-08 12 views
6

Ho un elenco di file in un array in cui il nomefile è la chiave e il valore è l'ultima data di modifica in secondi. Sono ordinati dal più vecchio al più recente.È possibile utilizzare array_shift() in PHP e ottenere la chiave?

I file sono glob() 'd, e quindi ordinati in questo modo utilizzando

asort($fileNameToLastModified, SORT_NUMERIC); 

Io uso array_shift() per ottenere il file più vecchio. Purtroppo, sembra darmi il valore, e non sembra esserci un modo per ottenere la chiave.

L'unico modo per farlo è qualcosa di simile?

$keys = array_keys($fileNameToLastModified); 

$oldest = array_shift($keys); 
array_shift($fileNameToLastModified); // to manually chop the first array member off too. 

... oppure esiste un metodo integrato per farlo?

risposta

13
$result = array_splice($yourArray, 0, 1); 

... dovrebbe fare il trucco. Vedi array_splice.

+0

Ho finito solo mantenendo quello Ho avuto, perché con questo ho ancora bisogno di fare un 'array_keys()' e ottenere un membro dell'array. Ma questo è ancora un altro modo per farlo, quindi lo accetto :) – alex

+0

Penso che tu intenda "$ result = key (array_splice ($ yourArray, 0, 1));'? – cronoklee

0

Si potrebbe anche fare questo:

<?php 

$arr = array('a' => 'first', 'b' => 'second'); 

// This is your key,value shift line 
foreach($arr as $k => $v) { break; } 

echo "Key: $k\nValue: $k"; 

Questo stamperà:

Key: a 
Value: first 

io non sono sicuro di come la prestazione è, così si potrebbe desiderare di fare un po 'di profilazione, ma è probabile essere più veloce di array_keys() per array di grandi dimensioni, poiché non ha bisogno di iterare su tutta la faccenda.

+0

Dal momento che copia l'intero '$ arr ', direi che potrebbe essere terribile su grandi array. – zneak

+1

'foreach()' non dovrebbe copiare l'array, sicuramente? –

+1

Non copia l'array se tutto il corpo ha "break". – alex

0

È possibile dare un'occhiata a key(), current() o each(). Fanno ciò che hai chiesto.

Non sono davvero sicuro se si intende effettivamente ottenere più coppie chiave/valore dall'array in seguito. Quindi non entrerò nei dettagli di cos'altro potresti dover fare.

3

Si potrebbe utilizzare each come:

$b = array(1=>2, 3=>4, 7=>3); 
while(1) { 
    list($key,$value) = each($b); 
    if (empty($key)) 
     break; 
    echo "$key $val\n"; 
} 

Iterazione l'array con each manterrà la sua ultima posizione.

2

approccio diverso:

list ($vlid, $selected) = each($srcData); array_shift($srcData); 

... (o solo list($key)... se non ha bisogno $value). Vedi each e list.

Edit: Come @ztate ha sottolineato nel suo commento, each() funzione sono stati deprecati in modo da contare in questo approccio non è più una buona idea.

Ma penso che un comportamento simile può essere affrontato utilizzando la nuova funzione di key() questo modo (non testata):

$vlid = key($srcData); $selected = array_shift($srcData); 
+0

Attenzione: la funzione 'Each' è stata DEPRECATED dal PHP 7.2.0. Affidarsi a questa funzione è altamente scoraggiato. – zstate

+0

L'intero PHP è deprecato per me. Ma buon punto: sembra che sia una nuova vittima della solita incongruenza di PHP tra le varie versioni, quindi non si può usare questo approccio (anche se non mi fido, questo ti salverà da altre modifiche). A mio avviso, un comportamento simile potrebbe essere affrontato con nuove funzioni 'key()', 'current()' e 'next()'. Tre chiamate di funzioni invece di una (nonostante la chiamata 'list()' che sicuramente potrebbe essere evitata. – bitifet

0

Un'altra possibilità che è l'abbreviazione di lavoro:

foreach ($array as $key => $value) break; 
unset($array[$key]); 
Problemi correlati