Снаждане на масив с персонализиран ключ

Кажете, че имам този код

$test = array();
$test['zero'] = 'abc';
$test['two'] = 'ghi';
$test['three'] = 'jkl';
dump($test);

array_splice($test, 1, 0, 'def');

dump($test);

Което ми дава резултата

Array
(
    [zero] => abc
    [two] => ghi
    [three] => jkl
)

Array
(
    [zero] => abc
    [0] => def
    [two] => ghi
    [three] => jkl
)

Мога ли все пак да задам ключа, така че вместо 0 да е one? В действителния код, от който се нуждая, позицията (1 в този пример) и клавишът за изискване (един в този пример) ще бъдат динамични.


person TMH    schedule 02.07.2014    source източник
comment
Защо просто не използвате $array['one'] = 'def' и след това използвате някои sort - персонализирани или естествени.   -  person u_mulder    schedule 02.07.2014
comment
Не мисля, че можете, но писането на персонализирана функция за това не би трябвало да е чак толкова голям проблем, или не е?   -  person kero    schedule 02.07.2014
comment
Това е, което може да се наложи да направя, но сортирането може да е неудобно, редът за текущата ми ситуация ще бъде 52,51,50,44,49,46,47,48.   -  person TMH    schedule 02.07.2014
comment
Много свързано: stackoverflow.com/a/21336407/476, stackoverflow.com/a/20426958/476   -  person deceze♦    schedule 02.07.2014
comment
Въпросът е - за какво ви трябва? Тъй като е асоциативен масив, вероятно не се интересувате от реда на ключовете   -  person Marcin Nabiałek    schedule 02.07.2014
comment
@Marcin Не е неразумно да искате да имате подредени, асоциативни масиви.   -  person deceze♦    schedule 02.07.2014


Отговори (3)


Нещо като това:

$test = array_merge(array_slice($test, 0, 1),
                    array('one'=>'def'),
                    array_slice($test, 1, count($test)-1));

Или по-кратко:

$test = array_merge(array_splice($test, 0, 1), array('one'=>'def'), $test);

Още по-кратко:

$test = array_splice($test, 0, 1) + array('one'=>'def') + $test;

За PHP >= 5.4.0:

$test = array_splice($test, 0, 1) + ['one'=>'def'] + $test;
person AbraCadaver    schedule 02.07.2014

function array_insert (&$array, $position, $insert_array) { 
  $first_array = array_splice ($array, 0, $position); 
  $array = array_merge ($first_array, $insert_array, $array); 
} 

array_insert($test, 1, array ('one' => 'def')); 

в: http://php.net/manual/en/function.array-splice.php

person Linesofcode    schedule 02.07.2014

Трябва да направите това ръчно:

# Insert at offset 2

$offset = 2;
$newArray = array_slice($test, 0, $offset, true) +
            array('yourIndex' => 'def') +
            array_slice($test, $offset, NULL, true);
person orif    schedule 02.07.2014