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

4 minutos de lectura

¿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',
);

avatar de usuario
Marcos Eirich

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 añadida 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.

  • @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.

    – Mark Eirich

    1 de julio de 2012 a las 22:17

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

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

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.

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

    – nzn

    10 de marzo de 2015 a las 14:44


avatar de usuario
Eugenio Kaurov

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);

avatar de usuario
Emil Vikström

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.

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

    usuario1493356

    30 de junio de 2012 a las 18:01

  • Creo que el “=” es un error de sintaxis: return = array_reverse($arr, true);

    – Mark Eirich

    30 de junio de 2012 a las 18:10

  • Además, cuando ejecuto su código, obtengo una matriz con un solo elemento… 🙁

    – Mark Eirich

    30 de junio de 2012 a las 18:11

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

    usuario1493356

    30 de junio de 2012 a las 18:01

  • Creo que el “=” es un error de sintaxis: return = array_reverse($arr, true);

    – Mark Eirich

    30 de junio de 2012 a las 18:10

  • Además, cuando ejecuto su código, obtengo una matriz con un solo elemento… 🙁

    – Mark Eirich

    30 de junio de 2012 a las 18:11

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad