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

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

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

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

Ответы на вопрос(7)

я предпочитаюмассив слияния с решением @ Mark.

$myArray = array_merge( ['one' => $myArray['one']], $myArray);

 30 апр. 2018 г., 14:47
это решение преобразует ассоциативный массив в обычный индексированный массив

Вот еще одна простая строчка, которая делает это, используяarray_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;
Решение Вопроса

Это работает:

$myArray = array('one' => $myArray['one']) + $myArray;
 01 июл. 2012 г., 17:50
Любая идея, что это за производительность?
 02 июл. 2012 г., 00:17
@andrewtweber Нет, не знаю, но я провел некоторое тестирование и обнаружил, что по сравнению с подходом Эмиля он в 3 раза быстрее и занимает вдвое меньше памяти. Я также обнаружил, что это занимает на 20% больше времени, чем перемещение того же элемента в конец массива.
 02 апр. 2015 г., 23:21
Это замечательно! Но почему это работает? Похоже, вы бы в конечном итоге с "один" в начале массиваand в своем первоначальном месте ...
 07 апр. 2015 г., 16:38
@squarecandy Ключи массива уникальны, поэтому невозможно, чтобы они существовали в двух местах. Также, пожалуйста, смотритеphp.net/manual/en/language.operators.array.php - & quot; Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут игнорироваться. & quot;
 30 июн. 2012 г., 20:04
Это действительно работает! Спасибо.

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

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

если у вас есть 2 массива, 1st имеет элементы для перемещения к вершине второго массива элементов, вы можете использовать

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

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

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

Просто настройте его в соответствии со своими потребностями или используйте его и отмените указатель для перемещения. Работает с ассоциативными массивами тоже.

 10 мар. 2015 г., 15:44
Исправление: $ new_arr [$ arr_key] = $ arr_value; Должно быть: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Но в остальном: отлично! 1UP.

В комментариях руководства по 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 сортировать массив по ключам и предоставлять собственную функцию сортировки.

 30 июн. 2012 г., 20:10
Я думаю, что & quot; = & quot; это синтаксическая ошибка:return = array_reverse($arr, true);
 30 июн. 2012 г., 20:01
Привет - спасибо за ответ, хотя я не хочу сортировать массив в любом случае. Я хочу иметь возможность узнать ключ элемента и переместить только этот специфический элемент в начало массива
 30 июн. 2012 г., 20:14
Нашел и исправил ошибки. Этот код теперь работает.
 30 июн. 2012 г., 20:11
Кроме того, когда я запускаю ваш код, я получаю массив только с одним элементом ... :-(

Ваш ответ на вопрос