PHP: об'єднати два масиви, зберігаючи клавіші замість повторного декседування?


255

Як я можу об'єднати два масиви (один із рядками = = пари значень та інший з парами int => значення), зберігаючи клавіші string / int? Жодна з них ніколи не перекриватиметься (адже одна має лише рядки, а друга - лише цілі числа).

Ось мій поточний код (який не працює, оскільки array_merge повторно індексує масив цілими ключами):

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
Це дивно: відповідно до сторінки документа PHP, array_merge не повинен цього робити. Чи є рядкові клавіші насправді рядковими поданнями цілих чисел?
Owenmarshall

array_merge реіндексує мій другий масив. тобто. це зміна масиву з array( 123 => "VALUE123" )наarray( 0 => "VALUE123" )
Гаррет

хм, це цікаво. Я припускаю, що документація PHP може бути трохи незрозумілою з цього приводу. Він говорить про те, що буде, якщо всі масиви мають цифрові клавіші, але конкретно не сказано, що буде, якщо вони не будуть.
Стівен Окслі

можливо, не 2 роки тому. Але в 2012 році документація на цю тему є чітко зрозумілою.
cartbeforehorse

Насправді документація досі не є чітко зрозумілою. "Числовий" насправді включає рядок з усіма цифрами (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Боб Штейн

Відповіді:


557

Ви можете просто "додати" масиви:

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
Будьте ДУЖЕ обережні з цим! Оператор + не є доповненням, це об'єднання. Якщо клавіші не перетинаються, тоді все добре, але якщо вони будуть ...
GordonM

3
Просто ух - ви врятували мені відра з рядків коду майже три роки.
Стівен О'Флін

85
Якщо хтось задається питанням: "що робити, якщо вони НЕ перекриваються?" : php.net: "Оператор + повертає правий масив, доданий до лівого масиву; для ключів, що існують в обох масивах, будуть використовуватися елементи з лівого масиву, а відповідні елементи справа -синхронний масив буде проігноровано. "
Фліон

2
@Flion це складніше за це. Використовуючи "+", я щойно додав два підмасиви з елементом із загальним ключем та підрозділом: додані значення! 100000 => масив (розмір = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => масив (size = 1) 2 => int 30 Результат: 100000 => масив (розмір = 3) 1 => int 128 2 => int 86 3 => int 7 В основному додавання [2 => 56] + [2 => 30] не замінило значення, а додало його і стало [2 => 86]
Даріо Фумагаллі

1
@DarioFumagalli Я не знаю, чи я нерозумію, чи це просто змінилося з 2016 року, але в цей момент часу операція print_r([2 => 56] + [2 => 30]);дає результати Array ( [2] => 56 ). Отже, це зберігання лівої сторони, як зазначено. Це , як в PHP 7.1.19, працює на repl.it .
Чарльз Вуд

62

Враховуючи, що у вас є

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

Виконання $merge = $replacement + $replaced;буде виводити:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

Перший масив із суми матиме значення у кінцевому результаті.

Виконання $merge = $replaced + $replacement;буде виводити:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[thumbsup] on this
Jhourlad Estrella

21
Підводячи підсумок, додаючи 2 масиви, значення з першого переосмислюють значення з другого.
Дзямід

1
Я думав, що другий переможе перший. :)
Асім КТ

1
Саме так. Тому я не міг використати $allValues += $newValues;.
MarthyM

Це $merge = $replacement + $replaced;буде результатом:Array ( [4] => value2 [6] => value3 [1] => value1 )
Шандан Шарма

24

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

Окрім додавання ключів / значень до існуючих масивів, використовуючи +знак, який ви можете зробити array_replace.

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

Результатом буде:

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

Ті ж ключі будуть перезаписані останнім масивом.
Є також і те array_replace_recursive, що роблять це і для підрядників.

Живий приклад на 3v4l.org


3

Два масиви можна легко додати або об'єднати, не змінюючи їх оригінальну індексацію за допомогою + оператора. Це дуже допоможе у спадному виборі вибору спадного рівня laravel та codeigniter.

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

Вихід буде:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

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