2010-03-08 13 views
6

Tengo una lista de archivos en una matriz donde el nombre de archivo es la clave y el valor es la última fecha de modificación en segundos. Se ordenan desde el más antiguo al más nuevo.¿Es posible usar array_shift() en PHP y obtener la clave?

Los archivos son glob() 'd en, y luego ordenados de esta manera el uso de

asort($fileNameToLastModified, SORT_NUMERIC); 

utilizo array_shift() para obtener el archivo más antiguo. Desafortunadamente, parece que me está dando el valor, y no parece haber una forma de obtener la clave.

¿La única forma de hacerlo sería algo como esto?

$keys = array_keys($fileNameToLastModified); 

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

... ¿o hay un método incorporado para hacerlo?

Respuesta

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

... deberían hacer el truco. Ver array_splice.

+0

Acabé mantener lo Lo hice, porque con esto todavía necesito hacer una 'array_keys()' y obtener un miembro de la matriz. Pero esta es otra forma de hacerlo, así que lo aceptaré :) – alex

+0

Creo que te refieres a '$ result = key (array_splice ($ yourArray, 0, 1));'? – cronoklee

0

También puede hacer esto:

<?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"; 

Esta es la salida:

Key: a 
Value: first 

No estoy seguro de cómo el rendimiento es, por lo que es posible que desee hacer un poco de perfiles, pero es probable ser más rápido que array_keys() para arreglos grandes, ya que no necesita iterar sobre todo.

+0

Como copia todo el '$ arr', diría que podría ser terrible en arreglos grandes. – zneak

+1

'foreach()' no debería copiar la matriz, ¿no? –

+1

No copia la matriz si todo el cuerpo tiene 'break'. – alex

0

Puede echar un vistazo a key(), current() o each(). Ellos hacen lo que pediste.

No estoy seguro de si tiene la intención de obtener más parejas de clave/valor de la matriz después. Así que no entraré en detalles sobre qué más podría necesitar hacer.

3

Usted podría utilizar como each:

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

iteración la matriz con each mantendrá su última posición.

2

enfoque diferente:

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

... (o simplemente list($key)... si usted no necesita $value). Ver each y list.

Editar: Como @ztate señaló en su comentario, la función each() ha quedado obsoleta, por lo que confiar en este enfoque ya no es una buena idea.

Pero creo comportamiento similar se puede abordar mediante el uso de la nueva función key() esta manera (no probado):

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

Advertencia: 'Cada función' ha sido DEPURADA a partir de PHP 7.2.0. Confiar en esta función es altamente desaconsejado. – zstate

+0

Todo el PHP está en desuso para mí. Pero un buen punto: parece que es una nueva víctima de la inconsistencia habitual de PHP en todas las versiones, por lo que este enfoque no debe utilizarse (incluso no confío en que lo salve de otros cambios). Por cierto, creo que las nuevas funciones 'key()', 'current()' y 'next()' podrían abordar el comportamiento similar. Tres llamadas de función en lugar de una (a pesar de la llamada 'list()' que ciertamente podría evitarse. – bitifet

0

Otra posibilidad que es la abreviatura de trabajo:

foreach ($array as $key => $value) break; 
unset($array[$key]); 
Cuestiones relacionadas