PHP: sposta l'elemento dell'array associativo all'inizio dell'array


94

Quale sarebbe il metodo migliore per spostare qualsiasi elemento di un array associativo all'inizio dell'array?

Ad esempio, supponiamo di avere il seguente 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',
);

Quello che voglio fare è spostare l'elemento "uno" all'inizio e finire con il seguente array:

$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 

Risposte:


182

È possibile utilizzare l'operatore di unione di array ( +) per unire l'array originale a un nuovo array associativo utilizzando il tasto noto ( one).

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

Le chiavi array sono univoche, quindi sarebbe impossibile che esistano in due posizioni.

Si prega di consultare php.net/manual/en/language.operators.array.php:

L'operatore + restituisce l'array di destra aggiunto all'array di sinistra; per le chiavi che esistono in entrambi gli array, verranno usati gli elementi dell'array di sinistra e gli elementi corrispondenti dell'array di destra verranno ignorati.


3
@andrewtweber No, non lo so, ma ho fatto dei test e ho scoperto che, rispetto all'approccio di Emil, è 3 volte più veloce e richiede la metà della memoria. Ho anche scoperto che ci vuole il 20% in più di tempo rispetto allo spostamento dello stesso elemento alla fine dell'array.
Mark Eirich

5

Se si dispone di chiavi di matrice numerica e si desidera reindicizzare le chiavi di matrice, sarebbe meglio inserirla in array_mergequesto modo:

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

2

Un po 'tardi, ma nel caso qualcuno ne avesse bisogno, ho creato questo piccolo snippet.

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

Basta regolarlo in base alle proprie esigenze o utilizzarlo e disimpostare l'indice per spostarsi. Funziona anche con array associativi.


Una correzione: $ new_arr [$ arr_key] = $ arr_value; Dovrebbe essere: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Ma per il resto: eccellente! 1up.
nzn

1

Ecco un altro semplice one-liner che lo fa usando array_splice():

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

1

se hai 2 array, il primo ha elementi da spostare all'inizio del secondo array di elementi, puoi usare

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

Ecco un esempio di codice:

//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

C'è una funzione nei commenti del manuale PHP per array_unshift che può essere usata per aggiungere un elemento, con chiave, all'inizio di un array:

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

Disinserire l'elemento e reinserirlo di nuovo con la funzione precedente:

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

Un approccio più generale potrebbe essere quello di utilizzare uksort per ordinare il tuo array in base alle chiavi e fornire una tua funzione di ordinamento.


Ciao - grazie per la risposta, anche se non voglio ordinare l'array in alcun modo. Voglio essere in grado di conoscere una chiave di elementi e spostare solo quell'elemento specifico all'inizio della matrice

Penso che "=" sia un errore di sintassi:return = array_reverse($arr, true);
Mark Eirich

Inoltre, quando
eseguo il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.