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

fuente

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.

Mark Eirich
fuente
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 );
trante
fuente
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.

Sune
fuente
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;
Billynoah
fuente
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);
Eugene Kaurov
fuente
-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.

Emil Vikström
fuente
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