2012-06-30 18 views
63

¿Cuál sería el mejor método para mover cualquier elemento de una matriz asociativa al comienzo de la matriz?PHP: Mover el elemento asociativo de la matriz al comienzo de la matriz

Por ejemplo, decir que tengo la siguiente matriz:

$myArray = array(
    'two' => 'Blah Blah Blah 2', 
    'three' => 'Blah Blah Blah 3', 
    'one' => 'Blah Blah Blah 1', 
    'four' => 'Blah Blah Blah 4', 
    'five' => 'Blah Blah Blah 5', 
); 

Lo que quiero hacer es mover el elemento de 'uno' al principio y terminar con la siguiente matriz:

$myArray = array(
    'one' => 'Blah Blah Blah 1', 
    'two' => 'Blah Blah Blah 2', 
    'three' => 'Blah Blah Blah 3', 
    'four' => 'Blah Blah Blah 4', 
    'five' => 'Blah Blah Blah 5', 
); 

Respuesta

125
Esto funciona

:

$myArray = array('one' => $myArray['one']) + $myArray; 
+0

Eso sí que funciona! Gracias. –

+2

¿Alguna idea de lo que es el gran rendimiento de esto? – andrewtweber

+3

@andrewtweber No, no lo hago, pero hice algunas pruebas y descubrí que, en comparación con el enfoque de Emil, es 3 veces más rápido y requiere la mitad de la memoria. También encontré que toma un 20% más de tiempo que mover el mismo elemento al final de la matriz. –

-1

Hay una función en las observaciones del manual de PHP para array_unshift que puede ser utilizado para añadir un elemento, con llave, para el comienzo de una matriz:

function array_unshift_assoc(&$arr, $key, $val) 
{ 
    $arr = array_reverse($arr, true); 
    $arr[$key] = $val; 
    return array_reverse($arr, true); 
} 

desarmar el elemento y vuelva a insertar de nuevo con la función anterior:

$tmp = $myArray['one']; 
unset($myArray['one']); 
$myArray = array_unshift_assoc($myArray, 'one', $tmp); 

un enfoque más general puede ser utilizar uksort para ordenar su matriz por claves y proporcionar una función de clasificación propia.

+0

Hola, gracias por la respuesta, aunque no quiero ordenar la matriz de ninguna manera.Quiero ser capaz de conocer una clave de elementos y mover solo ese elemento específico al comienzo de la matriz –

+0

Creo que "=" es un error de sintaxis: 'return = array_reverse ($ arr, true);' –

+0

Además, cuando Ejecuto su código Obtengo una matriz con solo un elemento ... :-( –

3

Si tiene claves de matriz numérica y desea indexar claves de matriz, que sería mejor para ponerlo en array_merge así:

$myArray = array_merge(array($key => $value) + $myArray); 
1

Un poco tarde, pero en caso de que alguien lo necesita, he creado este pequeño fragmento.

function arr_push_pos($key, $value, $pos, $arr) 
{ 
    $new_arr = array(); 
    $i = 1; 

    foreach ($arr as $arr_key => $arr_value) 
    { 
     if($i == $pos) 
      $new_arr[$key] = $value; 

     $new_arr[$arr_key] = $arr_value; 

     ++$i; 
    } 

    return $new_arr; 
} 

Sólo ajustar para que se adapte a sus necesidades, ni lo utilice y desarmar el índice de moverse. Funciona con arreglos asociativos también.

+0

Una corrección: $ new_arr [$ arr_key] = $ arr_value; Debería ser: if ($ arr_key! = $ key) \t \t \t $ new_arr [$ arr_key] = $ arr_value; De lo contrario: ¡excelente! 1up. – nzn

0

Aquí hay otro sencillo de una sola línea que recibe este hecho usando array_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray; 
0
//source array  
$myArray = array(
    'two' => 'Blah Blah Blah 2', 
    'three' => 'Blah Blah Blah 3', 
    'one' => 'Blah Blah Blah 1', 
    'four' => 'Blah Blah Blah 4', 
    'five' => 'Blah Blah Blah 5', 
); 
// set necessary order 
$orderArray = array(
    'one' => '', 
    'two' => '', 
); 
//apply it 
$result = array_replace($orderArray, $myArray); 
print_r($result); 
0

prefiero array-merge con @ solución de Mark.

$myArray = array_merge(['one' => $myArray['one']], $myArray);

Cuestiones relacionadas