PHP: Mueva el elemento de matriz asociativo al comienzo de la matriz

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

Por ejemplo, digamos 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 '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',
);

preguntado el 30 de junio de 12 a las 18:06

6 Respuestas

Puede utilizar el operador de unión de matriz (+) para unir la matriz original a una nueva matriz asociativa utilizando la clave conocida (one).

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

Las claves de matriz son únicas, por lo que sería imposible que existan en dos ubicaciones.

Ver más en el documento en operadores de matriz:

El operador + devuelve la matriz de la derecha adjunta a la matriz de la izquierda; para las claves que existen en ambas matrices, se utilizarán los elementos de la matriz de la izquierda y se ignorarán los elementos coincidentes de la matriz de la derecha.

Respondido el 02 de Septiembre de 20 a las 09:09

@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 memoria. También descubrí que lleva un 20% más de tiempo que mover el mismo elemento al final de la matriz. - Marcos Eirich

Si tiene claves de matriz numérica y desea reindexar claves de matriz, sería mejor ponerlo en array_merge Me gusta esto:

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

Respondido el 24 de junio de 13 a las 11:06

Un poco tarde, pero en caso de que alguien lo necesite, creé 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;
}

Simplemente ajústelo para satisfacer sus necesidades, o utilícelo y desactive el índice para moverlo. También funciona con matrices asociativas.

respondido 19 mar '14, 07:03

Una corrección: $new_arr[$arr_key] = $arr_value; Debería ser: if ($arr_key != $key) $new_arr[$arr_key] = $arr_value; Pero por lo demás: ¡excelente! 1 de ventaja. - nzn

Aquí hay otra frase simple que hace esto usando array_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;

Respondido el 21 de junio de 17 a las 19:06

si tiene 2 matrices, la primera tiene elementos para moverse a la parte superior de la segunda matriz de elementos, puede usar

$result = \array_replace($ArrayToMoveToTop, $myArray);

Aquí hay una muestra de código:

//source array    
$myArray = [
    '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 = [
    'one' => '',
    'two' => '',
];
//apply it
$result = \array_replace($orderArray, $myArray);
\print_r($result);

Respondido el 28 de enero de 19 a las 17:01

Hay una función en los comentarios del manual de PHP para array_unshift que se puede usar para agregar un elemento, con clave, al comienzo de una matriz:

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

Desactive el elemento y vuelva a insertarlo 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 ordenar para ordenar su matriz por claves y proporcionar una función de clasificación propia.

Respondido el 30 de junio de 12 a las 19:06

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

Creo que el "=" es un error de sintaxis: return = array_reverse($arr, true); - Marcos Eirich

Además, cuando ejecuto su código, obtengo una matriz con un solo elemento... :-( - Marcos Eirich

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.