PHP: Verschieben Sie das assoziative Array-Element an den Anfang des Arrays

93

Was wäre die beste Methode, um ein Element eines assoziativen Arrays an den Anfang des Arrays zu verschieben?

Angenommen, ich habe das folgende 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',
);

Was ich tun möchte, ist das 'one'-Element an den Anfang zu verschieben und am Ende das folgende Array zu erhalten:

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

quelle

Antworten:

181

Sie können den Array-Union-Operator ( +) verwenden, um das ursprüngliche Array mit dem bekannten Schlüssel ( one) mit einem neuen assoziativen Array zu verbinden .

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

Array-Schlüssel sind eindeutig, sodass sie nicht an zwei Orten vorhanden sein können.

Weitere Informationen finden Sie unter php.net/manual/en/language.operators.array.php:

Der Operator + gibt das rechte Array zurück, das an das linke Array angehängt ist. Für Schlüssel, die in beiden Arrays vorhanden sind, werden die Elemente aus dem linken Array verwendet und die übereinstimmenden Elemente aus dem rechten Array werden ignoriert.

Mark Eirich
quelle
3
@andrewtweber Nein, das tue ich nicht, aber ich habe einige Tests durchgeführt und festgestellt, dass es im Vergleich zu Emils Ansatz dreimal schneller ist und halb so viel Speicher benötigt. Ich habe auch festgestellt, dass es 20% länger dauert, als dasselbe Element an das Ende des Arrays zu verschieben.
Mark Eirich
5

Wenn Sie numerische Array-Schlüssel haben und Array-Schlüssel neu indizieren möchten, ist es besser, sie array_mergewie folgt einzugeben :

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

Ein bisschen spät, aber falls jemand es braucht, habe ich dieses kleine Snippet erstellt.

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

Passen Sie es einfach an Ihre Bedürfnisse an oder verwenden Sie es und deaktivieren Sie den Index, um sich zu bewegen. Funktioniert auch mit assoziativen Arrays.

Sune
quelle
Eine Korrektur: $ new_arr [$ arr_key] = $ arr_value; Sollte sein: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Aber sonst: ausgezeichnet! 1up.
nzn
1

Hier ist ein weiterer einfacher Einzeiler, mit dem dies erledigt wird array_splice():

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

Wenn Sie zwei Arrays haben, hat das erste Elemente, die an die Spitze des zweiten Arrays von Elementen verschoben werden können

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

Hier ist ein Codebeispiel:

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

In den Kommentaren des PHP-Handbuchs für array_unshift gibt es eine Funktion , mit der ein Element mit Schlüssel am Anfang eines Arrays hinzugefügt werden kann:

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

Deaktivieren Sie das Element und setzen Sie es mit der obigen Funktion erneut ein:

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

Ein allgemeinerer Ansatz könnte darin bestehen, uksort zu verwenden, um Ihr Array nach Schlüsseln zu sortieren und eine eigene Sortierfunktion bereitzustellen.

Emil Vikström
quelle
Hallo - danke für die Antwort, obwohl ich das Array in keiner Weise sortieren möchte. Ich möchte in der Lage sein, einen Elementschlüssel zu kennen und nur dieses spezifische Element an den Anfang des Arrays zu verschieben
Ich denke, das "=" ist ein Syntaxfehler:return = array_reverse($arr, true);
Mark Eirich
Wenn ich Ihren Code ausführe, erhalte ich außerdem ein Array mit nur einem Element ... :-(
Mark Eirich