PHP: переместить элемент ассоциативного массива в начало массива

96

Как лучше всего переместить любой элемент ассоциативного массива в начало массива?

Например, скажем, у меня есть следующий массив:

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

Я хочу переместить «один» элемент в начало и получить следующий массив:

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

источник

Ответы:

183

Вы можете использовать оператор объединения массивов ( +), чтобы присоединить исходный массив к новому ассоциативному массиву с помощью известного ключа ( one).

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

Ключи массива уникальны, поэтому он не может существовать в двух местах.

См. Далее в документации по операторам массива:

Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут проигнорированы.

Марк Эйрих
источник
3
@andrewtweber Нет, не знаю, но я провел небольшое тестирование и обнаружил, что по сравнению с подходом Эмиля он в 3 раза быстрее и занимает вдвое меньше памяти. Я также обнаружил, что это занимает на 20% больше времени, чем перемещение того же элемента в конец массива.
Mark Eirich
6

Если у вас есть ключи числового массива и вы хотите переиндексировать ключи массива, было бы лучше поместить его array_mergeтак:

$myArray = array_merge(array($key => $value) + $myArray );
транте
источник
2

Немного поздно, но на случай, если кому-то это понадобится, я создал этот небольшой фрагмент.

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

Просто настройте его в соответствии с вашими потребностями или воспользуйтесь им и отключите индекс, чтобы переместить его. Также работает с ассоциативными массивами.

Sune
источник
Исправление: $ new_arr [$ arr_key] = $ arr_value; Должно быть: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; А в остальном: отлично! 1up.
nzn
1

Вот еще один простой однострочник, в котором это можно сделать с помощью array_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;
Биллиноа
источник
1

если у вас есть 2 массива, у 1-го есть элементы для перемещения в верхнюю часть 2-го массива элементов, вы можете использовать

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

Вот пример кода:

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

В комментариях к руководству по PHP для array_unshift есть функция, которую можно использовать для добавления элемента с ключом в начало массива:

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

Отключите элемент и снова вставьте его с помощью вышеуказанной функции:

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

Более общий подход может заключаться в использовании uksort для сортировки вашего массива по ключам и предоставления вашей собственной функции сортировки.

Эмиль Викстрём
источник
Привет - спасибо за ответ, хотя я не хочу никоим образом сортировать массив. Я хочу знать ключ элементов и перемещать только этот конкретный элемент в начало массива
Я думаю, что знак "=" является синтаксической ошибкой:return = array_reverse($arr, true);
Марк Эйрих,
Кроме того, когда я запускаю ваш код, я получаю массив только с одним элементом в нем ... :-(
Марк Эйрих