PHP: Переміщення асоціативного елемента масиву на початок масиву


94

Який найкращий метод переміщення будь-якого елементу асоціативного масиву на початок масиву?

Наприклад, скажімо, що я маю такий масив:

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

Що я хочу зробити, це перенести елемент 'one' на початок і закінчити таким масивом:

$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 

Відповіді:


182

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

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

Ключі масиву унікальні, тому було б неможливо існувати в двох місцях.

Дивіться далі в документі " Оператори масивів":

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


3
@andrewtweber Ні, ні, але я протестував і виявив, що порівняно з підходом Еміля це в 3 рази швидше і займає вдвічі менше пам'яті. Я також виявив, що це займає на 20% більше часу, ніж переміщення того самого елемента в кінець масиву.
Mark Eirich

5

Якщо у вас є числові ключі масиву і ви хочете переіндексувати ключі масиву, було б краще ввести його 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;
}

Просто відрегулюйте його відповідно до своїх потреб або скористайтеся ним та зніміть індекс для переміщення. Працює також з асоціативними масивами.


Виправлення: $ new_arr [$ arr_key] = $ arr_value; Має бути: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Але інакше: чудово! 1 вгору.
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);
Марк Ейріх

Крім того, коли я запускаю ваш код, я отримую масив із лише одним елементом у ньому ... :-(
Mark Eirich
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.