2010-03-01 10 views
39

Tener una congelación cerebral sobre un problema bastante trivial. Si comienzo con una serie como esta:¿Cómo muevo un elemento de matriz con una clave conocida al final de una matriz en PHP?

$my_array = array(
        'monkey' => array(...), 
        'giraffe' => array(...), 
        'lion' => array(...) 
); 

... y los nuevos elementos podrían agregarán con llaves diferentes, pero siempre es un valor de la matriz. Ahora puedo estar seguro de que el primer elemento siempre tendrá la clave 'mono', pero no puedo estar seguro de ninguna de las otras teclas.

Cuando termine de llenar la matriz, quiero mover el elemento conocido 'mono' al final de la matriz sin alterar el orden de los otros elementos. ¿Cuál es la forma más eficiente de hacer esto?

En todos los sentidos que puedo pensar parece un poco torpe y siento que me falta algo obvio.

Respuesta

67

La única manera que puedo pensar para hacer esto es para retirarla luego añadirlo:

$v = $my_array['monkey']; 
unset($my_array['monkey']); 
$my_array['monkey'] = $v; 
+3

Sí, esta es probablemente la mejor manera. Probablemente estoy pensando demasiado sobre eso. – tamewhale

+0

Esto ya no funciona en PHP 7.1, parece que –

+0

@RolandSeuhs exactamente lo que no funciona en PHP 7.1? Parece funcionarme bien. – JonnieJS

7

array_shift es probablemente menos eficiente que unsetting the index, pero funciona:

$my_array = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3); 
$my_array['monkey'] = array_shift($my_array); 
print_r($my_array); 

Otra alternativa es con una devolución de llamada y uksort:

uksort($my_array, create_function('$x,$y','return ($y === "monkey") ? -1 : 1;')); 

Deseará utilizar un lambda adecuado si está utilizando PHP5.3 + o simplemente defina la función como una función global regularmente.

+0

Ambas buenas respuestas. El género era algo que tenía en mente, pero parecía excesivo. – tamewhale

+2

@tamewhale Gracias. Hice un punto de referencia muy superficial con 24 animales y 'unset' es realmente el más rápido. Es 10 veces más rápido que 'array_shift' y 300 veces más rápido que' uksort'. – Gordon

+0

Me encanta el trazador de líneas uno, posiblemente no el más eficiente, pero en la mayoría de los casos nunca importará y la elegancia del enfoque 'array_shift()' lo hace limpio y legible. – billynoah

1

Puede implementar algunos cálculos básicos y obtener una función universal para mover el elemento de matriz de una posición a la otra.

Para PHP que se parece a esto:

function magicFunction ($targetArray, $indexFrom, $indexTo) { 
    $targetElement = $targetArray[$indexFrom]; 
    $magicIncrement = ($indexTo - $indexFrom)/abs ($indexTo - $indexFrom); 

    for ($Element = $indexFrom; $Element != $indexTo; $Element += $magicIncrement){ 
     $targetArray[$Element] = $targetArray[$Element + $magicIncrement]; 
    } 

    $targetArray[$indexTo] = $targetElement; 
} 

Salida "mover elementos de la matriz" a "gloommatter" para una explicación detallada.

http://www.gloommatter.com/DDesign/programming/moving-any-array-elements-universal-function.html

1

me gusta mucho la respuesta de @ Gordon arriba para su elegancia como un chiste, pero sólo funciona si la clave está en el comienzo. Aquí hay otro trazador de líneas que funcionará para una llave en cualquier posición:

$arr = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3); 
$arr += array_splice($arr,array_search('giraffe',array_keys($arr)),1); 
Cuestiones relacionadas