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


94

¿Cuál sería el mejor método para mover cualquier elemento de una matriz asociativa al principio 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',
);
php 

Respuestas:


182

Puede usar el operador de unión de matriz ( +) para unir la matriz original a una nueva matriz asociativa usando 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 exista en dos ubicaciones.

Más información en el documento sobre 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.


3
@andrewtweber No, no lo sé, 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

5

Si tiene claves de matriz numéricas y desea volver a indexar las claves de matriz, sería mejor ponerlo array_mergeasí:

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

2

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 que se adapte a sus necesidades o utilícelo y desarme el índice para moverlo. También funciona con matrices asociativas.


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

1

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

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

1

si tiene 2 matrices, la primera tiene elementos para mover 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);

-1

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

Desarme 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 usar uksort 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 una clave de elementos y mover solo ese elemento específico al comienzo de la matriz

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

Además, cuando ejecuto su código, obtengo una matriz con solo un elemento ... :-(
— Mark Eirich
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.