PHP: Przenieś asocjacyjny element tablicy na początek tablicy

95

Jaka byłaby najlepsza metoda przeniesienia dowolnego elementu tablicy asocjacyjnej na początek tablicy?

Na przykład załóżmy, że mam następującą tablicę:

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

Chcę przesunąć element „one” na początek i zakończyć z następującą tablicą:

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

źródło

Odpowiedzi:

182

Możesz użyć operatora unii tablicy ( +), aby połączyć oryginalną tablicę z nową tablicą asocjacyjną za pomocą znanego klucza ( one).

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

Klucze tablicowe są unikalne, więc byłoby niemożliwe, aby istniały w dwóch lokalizacjach.

Więcej informacji można znaleźć w dokumentacji dotyczącej operatorów tablic:

Operator + zwraca tablicę po prawej stronie dołączoną do tablicy po lewej stronie; w przypadku kluczy, które istnieją w obu tablicach, zostaną użyte elementy z tablicy po lewej stronie, a pasujące elementy z tablicy po prawej stronie zostaną zignorowane.

Mark Eirich
źródło
3
@andrewtweber Nie, nie wiem, ale przeprowadziłem kilka testów i odkryłem, że w porównaniu z podejściem Emila jest 3x szybsze i zajmuje o połowę mniej pamięci. Odkryłem również, że zajmuje to 20% więcej czasu niż przenoszenie tego samego elementu na koniec tablicy.
Mark Eirich
5

Jeśli masz numeryczne klucze tablicowe i chcesz ponownie zindeksować klucze tablicowe, lepiej byłoby umieścić to w array_mergeten sposób:

$myArray = array_merge(array($key => $value) + $myArray );
trante
źródło
2

Trochę późno, ale na wypadek, gdyby ktoś tego potrzebował, stworzyłem ten mały fragment.

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

Po prostu dostosuj go do swoich potrzeb lub użyj go i wyłącz indeks, aby się przesunął. Działa również z tablicami asocjacyjnymi.

Sune
źródło
Poprawka: $ new_arr [$ arr_key] = $ arr_value; Powinno być: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Ale poza tym: doskonale! 1up.
nzn
1

Oto kolejna prosta jedna linijka, która robi to za pomocą array_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;
billynoah
źródło
1

jeśli masz 2 tablice, pierwsza ma elementy do przeniesienia na początek drugiej tablicy elementów, możesz użyć

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

Oto przykładowy kod:

//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
źródło
-1

W komentarzach podręcznika PHP znajduje się funkcja dla array_unshift której można użyć do dodania elementu z kluczem na początku tablicy:

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

Usuń element i włóż go ponownie za pomocą powyższej funkcji:

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

Bardziej ogólnym podejściem może być użycie uksort do sortowania tablicy według kluczy i udostępnienia własnej funkcji sortowania.

Emil Vikström
źródło
Cześć - dzięki za odpowiedź, chociaż nie chcę w żaden sposób sortować tablicy. Chcę być w stanie poznać klucz elementów i przenieść tylko ten określony element na początek tablicy
Myślę, że „=” jest błędem składniowym:return = array_reverse($arr, true);
Mark Eirich
Ponadto, kiedy uruchamiam twój kod, otrzymuję tablicę zawierającą tylko jeden element ... :-(
Mark Eirich