Как объединить массивы php
Перейти к содержимому

Как объединить массивы php

  • автор:

Объединить массивы

Объединить массивы можно через функцию array_merge() .

$array1 = ['Symfony', 'Yii']; $array2 = ['Laravel', 'CakePHP']; $frameworks = array_merge($array1, $array2); $frameworks; // Array ( [0] => Symfony [1] => Yii [2] => Laravel [3] => CakePHP ) 

Если будут переданы ассоциативные массивы, то при объединении, элементы с одинаковыми ключами перезапишутся.

$array1 = ['version' => 5, 'developer' => 'Zend']; $array2 = ['lang' => 'PHP', 'version' => 7]; $lang = array_merge($array1, $array2); $lang; // Array ( [version] => 7 [developer] => Zend [lang] => PHP ) 

Обновлено: 01 ноября 2020

Комментарии

Авторизуйтесь, чтобы добавлять комментарии

Как объединить 2 массива в php

Когда мы работаем с php, то почти всегда имеем дело с массивами. А операция объединения массивов – это то, что приходится проделывать довольно часто.

При этом мы можем хотеть объединять массивы с заменой элементов, у которых встречаются одинаковые ключи

  • у первого массива
  • или у второго;
  • а возможно нам нужно, чтобы значения элементов одного массива стали ключами, а второго значениями.

Сегодня мы рассмотрим все эти варианты.

Существует несколько способов объединения массивов в php, но каждый из них может дать разные результаты. Очень важно хорошо осознавать, что и для чего вы делаете. От этого будет зависеть стабильность работы вашей программы.

На протяжении всего поста я буду рассматривать массивы, в каждом из которых 1 элемент имеет идентичный с элементом другого массива строковый ключ. Это важно, потому что при разных способах объединения мы будем получать разные результаты.

Объединение массивов без переиндексации

Чтобы объединить 2 или более массивов можно использовать оператор “+”.

При этом, если во втором массиве встретится элемент с ключом, который имеет элемент из первого массива, то элемент второго массива будет проигнорирован (или выброшен). Давайте посмотрим.

 "Anna", "age" => 34, "weight" => 52, ]; $arr2 = [ "name" => "Robinzon", "surname" => "Kruzo", ]; $result = $arr1 + $arr2; var_dump($result); ?>

А вот, что мы увидим на экране:

array(4) < ["name"]=>string(4) "Anna" ["age"]=> int(34) ["weight"]=> int(52) ["surname"]=> string(5) "Kruzo" >

Как видно элемент из второго массива с ключом “name” был проигнорирован и не попал в результирующий массив.

Объединение массивов с помощью array_merge

Объединить массивы можно при помощи функции array_merge. В этом случае при совпадении строкового ключа второго массива с ключом первого, будет перезаписано значение элемента первого массива.

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

Чтобы все это увидеть, я немного модифицирую массивы, добавив им также по элементу с одинаковыми числовыми ключами.

 "Anna", "age" => 34, "weight" => 52, 1 => "girl", ]; $arr2 = [ "name" => "Robinzon", "surname" => "Kruzo", 1 => "boy" ]; $result = array_merge($arr1, $arr2); var_dump($result); ?>

А результат будет вот таким:

array(6) < ["name"]=>string(8) "Robinzon" ["age"]=> int(34) ["weight"]=> int(52) [0]=> string(4) "girl" ["surname"]=> string(5) "Kruzo" [1]=> string(3) "boy" >

Как видите, элемент с ключом “name” добавился из второго массива, а элементы с числовыми индексами переиндексировались и оба оказались в массиве результата.

Объединение двух массивов в один ассоциативный

Сейчас посмотрим, как можно объединить 2 массива так, чтобы значения одного из них стали ключами, а значения второго – значениями.

Здесь нам поможет функция array_combine.

Она принимает 2 параметра:

  • первый – массив, из которого будут созданы ключи,
  • второй – массив, из которого будут созданы значения.

Количество элементов в массивах должно совпадать, иначе, вместо массива с результатом вы получите false.

Давайте модифицируем наши массивы и посмотрим, как это работает.

 "Anna", "age" => 34, "country" => "Russia", ]; $arr2 = [ "surname" => "Kruzo", "date_of_birth" => "03.06.1986", "city" => "St.Peter" ]; $result = array_combine($arr1, $arr2); var_dump($result); ?>

Результатом этого кода будет следующий массив:

array(3) < ["Anna"]=>string(5) "Kruzo" [34]=> string(10) "03.06.1986" ["Russia"]=> string(8) "St.Peter" >

Как видите, значения первого массива стали ключами, а значения второго – значениями элементов нового массива.

Надеюсь этот пост оказался вам полезным и теперь вы точно знаете все нюансы при объединении массивов в php.

В качестве благодарности ставьте лайки и оставляйте комментарии ))

Также можете подписаться на обновления и всегда быть в курсе новых постов. Здесь никакого спама – только полезное. Форма поиска в сайдбаре справа.

Как объединить массивы php

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Помог: 3 раз(а)

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Цитата:

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

array_combine

Создаёт массив ( array ), используя значения массива keys в качестве ключей и значения массива values в качестве соответствующих значений.

Список параметров

Массив ключей. Некорректные значения для ключей будут преобразованы в строку ( string ).

Возвращаемые значения

Возвращает скомбинированный массив ( array ).

Ошибки

Начиная с PHP 8.0.0, выдаётся ошибка ValueError , если количество элементов в keys и values не совпадает. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING .

Список изменений

Версия Описание
8.0.0 Функция array_combine() теперь выбрасывает ошибку ValueError , если количество элементов в массивах не совпадает; ранее функция возвращала значение false .

Примеры

Пример #1 Простой пример использования array_combine()

$a = array( ‘green’ , ‘red’ , ‘yellow’ );
$b = array( ‘avocado’ , ‘apple’ , ‘banana’ );
$c = array_combine ( $a , $b );

Результат выполнения приведённого примера:

Array ( [green] => avocado [red] => apple [yellow] => banana )

Смотрите также

  • array_merge() — Сливает один или несколько массивов
  • array_walk() — Применяет заданную пользователем функцию к каждому элементу массива
  • array_values() — Возвращает все значения массива
  • array_map() — Применяет callback-функцию ко всем элементам указанных массивов

User Contributed Notes 12 notes

10 years ago

If two keys are the same, the second one prevails.

Example:
print_r ( array_combine (Array( ‘a’ , ‘a’ , ‘b’ ), Array( 1 , 2 , 3 )));
?>
Returns:
Array
(
[a] => 2
[b] => 3
)

But if you need to keep all values, you can use the function below:

function array_combine_ ( $keys , $values )
$result = array();
foreach ( $keys as $i => $k ) $result [ $k ][] = $values [ $i ];
>
array_walk ( $result , create_function ( ‘&$v’ , ‘$v = (count($v) == 1)? array_pop($v): $v;’ ));
return $result ;
>

print_r ( array_combine_ (Array( ‘a’ , ‘a’ , ‘b’ ), Array( 1 , 2 , 3 )));
?>
Returns:
Array
(
[a] => Array
(
[0] => 1
[1] => 2
)

8 years ago

Further to loreiorg’s script
in order to preserve duplicate keys when combining arrays.

I have modified the script to use a closure instead of create_function

Reason: see security issue flagged up in the documentation concerning create_function

function array_combine_ ( $keys , $values ) $result = array();

foreach ( $keys as $i => $k ) $result [ $k ][] = $values [ $i ];
>

13 years ago

array_combine() has a strange bug/misfeature (as of PHP 5.3.2): There is no logical reason for throwing a warning and returning FALSE, instead of returning (see http://bugs.php.net/bug.php?id=34857). Here is a quick workaround:
function array_real_combine ( $a , $b )
return $a ===array() && $b ===array() ? array() : array_combine ( $a , $b );
>
?>

15 years ago

// If they are not of same size, here is solution:

$abbreviations = array( «AL» , «AK» , «AZ» , «AR» , «TX» , «CA» );
$states = array( «Alabama» , «Alaska» , «Arizona» , «Arkansas» );
function combine_arr ( $a , $b )
<
$acount = count ( $a );
$bcount = count ( $b );
$size = ( $acount > $bcount ) ? $bcount : $acount ;
$a = array_slice ( $a , 0 , $size );
$b = array_slice ( $b , 0 , $size );
return array_combine ( $a , $b );
>
$combined = combine_arr ( $abbreviations , $states );
print_r ( $combined );

// Output
// Array ( [AL] => Alabama [AK] => Alaska [AZ] => Arizona
// [AR] => Arkansas )
?>

5 years ago

I had an epiphany when try to handle NON-ASSOCIATIVE array forms in my controller. This little one liner can pretty much edit ANY kind of non-associative array. For example this one just returns an array of values inputed by a new user.

The $data value is the the json_decoded() value of a register form.
Here is used str_replace, you could definitely do a number of things like preg matches and other things.

$readyToProcessForUser = array_combine(str_replace(«new_user_», «», array_keys($data)), $data);

You could also do the same for the values.

$readyToProcessForUser = array_combine(array_keys($data), str_replace(«-«, «», $data));

Or BOTH!
Use full if you don’t want to walk an entire array and the keys through the same callback.

$readyToProcessForUser = array_combine(array_walk(‘trim’, array_keys($data)), array_walk(‘custom_callback’, array_values($data)));

12 years ago

If two keys are the same, the second one prevails.
Example:
print_r ( array_combine (Array( ‘a’ , ‘a’ , ‘b’ ), Array( 1 , 2 , 3 )));
?>
Returns:
Array
(
[a] => 2
[b] => 3
)

12 years ago

I needed to read CSV files into associative arrays with column headers as keys. Then I ran into a problem when you have empty columns at the end of a row because array_combine returns false if both arrays don’t have the same number of elements. This function based on quecoder at gmail’s combine_arr() below allowed me to pad either array or not when parsing my CSVs to arrays.
$a is the array of header columns and $b is an array of the current row retrieved with fgetcsv()

function array_combine_special ( $a , $b , $pad = TRUE ) $acount = count ( $a );
$bcount = count ( $b );
// more elements in $a than $b but we don’t want to pad either
if (! $pad ) $size = ( $acount > $bcount ) ? $bcount : $acount ;
$a = array_slice ( $a , 0 , $size );
$b = array_slice ( $b , 0 , $size );
> else // more headers than row fields
if ( $acount > $bcount ) $more = $acount — $bcount ;
// how many fields are we missing at the end of the second array?
// Add empty strings to ensure arrays $a and $b have same number of elements
$more = $acount — $bcount ;
for( $i = 0 ; $i < $more ; $i ++) $b [] = "" ;
>
// more fields than headers
> else if ( $acount < $bcount ) $more = $bcount - $acount ;
// fewer elements in the first array, add extra keys
for( $i = 0 ; $i < $more ; $i ++) $key = 'extra_field_0' . $i ;
$a [] = $key ;
>

return array_combine ( $a , $b );
>
?>

9 years ago

I recently had to flip an array and group the elements by value, this snippet will do that:
function flipAndGroup ( $input ) $outArr = array();
array_walk ( $input , function( $value , $key ) use (& $outArr ) if(!isset( $outArr [ $value ]) || ! is_array ( $outArr [ $value ])) $outArr [ $value ] = [];
>
$outArr [ $value ][] = $key ;
>);
return $outArr ;
>
?>

Example:
$users_countries = array(
‘username1’ => ‘US’ ,
‘user2’ => ‘US’ ,
‘newuser’ => ‘GB’
);
print_r ( flipAndGroup ( $users_countries ));
?>

Returns:
Array
(
[US] => Array
(
[0] => username1
[1] => user2
)

13 years ago

I needed a function that would take keys from one unequal array and combine them with the values of another. Real life application:
Select 4 product types.
Each product has a serial.
There are 4 sets of products.

function array_combine2 ( $arr1 , $arr2 ) $count1 = count ( $arr1 );
$count2 = count ( $arr2 );
$numofloops = $count2 / $count1 ;

$i = 0 ;
while( $i < $numofloops )$arr3 = array_slice ( $arr2 , $count1 * $i , $count1 );
$arr4 [] = array_combine ( $arr1 , $arr3 );
$i ++;
>

return $arr4 ;
>
?>

Input:
Array
(
[0] => SMART Board
[1] => Projector
[2] => Speakers
[3] => Splitter
)
, Array
(
[0] => serial to smart board1
[1] => serial to projector 1
[2] => serial to speakers 1
[3] => serials to splitter 1
[4] => serials to smart board 2
[5] => serials to projector 2
[6] => serials to speakers 2
[7] => serials to splitter 2
)

Array
(
[0] => Array
(
[SMART Board] => serial to smart board1
[Projector] => serial to projector 1
[Speakers] => serial to speakers 1
[Splitter] => serials to splitter 1
)

[1] => Array
(
[SMART Board] => serials to smart board 2
[Projector] => serials to projector 2
[Speakers] => serials to speakers 2
[Splitter] => serials to splitter 2
)

11 years ago

I was looking for a function that could combine an array to multiple one, for my MySQL GROUP_CONCAT() query, so I made this function.

function array_combine_array (array $keys )
$arrays = func_get_args ();
$keys = array_shift ( $arrays );

/* Checking if arrays are on the same model (array(‘INDEX’=> array()) or array()) */
$check = count ( array_unique ( array_map ( ‘is_array’ , array_map ( ‘current’ , $arrays )))) === 1 ;
if (! $check )

/* Checking the model of arrays, array(‘INDEX’ => array()) or Array() */
$assocArray = is_array ( array_shift ( array_map ( ‘current’ , $arrays )));

/* If empty $Keys is given, we fill an empty array */
if (empty( $keys )) $keys = array_keys ( array_fill ( 0 , max (( $assocArray ) ? array_map ( ‘count’ , array_map ( ‘current’ , $arrays )) : array_map ( ‘count’ , $arrays )), ‘foo’ ));

/* Init */
$ret =array(); $i = 0 ;
/* Cycling on each keys values, making an offset for each */
foreach( $keys as $v )
/* Cycling on arrays */
foreach ( $arrays as $k )
if ( $assocArray )
/* Getting the index of the element */
$key = key ( $k );
/* If the offset exists, we place it */
$ret [ $v ][ $key ] = isset( $k [ $key ][ $i ]) ? $k [ $key ][ $i ]: false ;
>
/* Making the array with auto-made index */
else
$ret [ $v ][] = isset( $k [ $i ]) ? $k [ $i ]: false ;
>
/* Getting the next offset */
$i ++;
>
return $ret ;
>

/* Examples */
$r = array( 1 , 2 , 4 , 10 );

$a1 = array( ‘one’ , ‘two’ , ‘four’ , ‘ten’ );
$a2 = array( ‘un’ , ‘deux’ , ‘quatre’ , ‘dix’ );
$a3 = array( ‘uno’ , ‘dos’ , ‘quatro’ , ‘diez’ );

print_r ( array_combine_array ( $r ,array( ‘english’ => $a1 ),array( ‘french’ => $a2 ),array( ‘spanish’ => $a3 ))); /* Associative index, associative subarray indexes */
print_r ( array_combine_array ( $r , $a1 ,array( ‘french’ => $a2 ),array( ‘spanish’ => $a3 ))); /* Ouputs Error */
print_r ( array_combine_array ( $r , $a1 , $a2 , $a3 )); /* Associative index, auto-made subarray indexes */
print_r ( array_combine_array (array(),array( ‘english’ => $a1 ),array( ‘french’ => $a2 ),array( ‘spanish’ => $a3 ))); /* Auto-made index, associative subarray indexes */
?>

12 years ago

I needed a function that truncated extra values, and only went as far as keys without throwing a warning as array_combine does.

function safeArrayCombine ( $keys , $values ) <
$combinedArray = array();

for ( $i = 0 , $keyCount = count ( $keys ); $i < $keyCount ; $i ++) <
$combinedArray [ $keys [ $i ]] = $values [ $i ];
>

6 years ago

This will seem obvious to some, but if you need to preserve a duplicate key, being you have unique vars, you can switch the array_combine around, to where the vars are the keys, and this will output correctly.

This [default] formula auto-removes the duplicate keys.

$i=0;
foreach (array_combine($keys, $vars) as $key => $var)
$i=$i;
echo($key);
echo » «;
echo($var);
>

This formula accomplishes the same thing, in the same order, but the duplicate «keys» (which are now vars) are kept.

$i=0;
foreach (array_combine($vars, $keys) as $var => $key)
$i=$i;
echo($key);
echo » «;
echo($var);
>

I know, I’m a newbie, but perhaps someone else will need this eventually. I couldn’t find another solution anywhere.

  • Функции для работы с массивами
    • array_​change_​key_​case
    • array_​chunk
    • array_​column
    • array_​combine
    • array_​count_​values
    • array_​diff_​assoc
    • array_​diff_​key
    • array_​diff_​uassoc
    • array_​diff_​ukey
    • array_​diff
    • array_​fill_​keys
    • array_​fill
    • array_​filter
    • array_​flip
    • array_​intersect_​assoc
    • array_​intersect_​key
    • array_​intersect_​uassoc
    • array_​intersect_​ukey
    • array_​intersect
    • array_​is_​list
    • array_​key_​exists
    • array_​key_​first
    • array_​key_​last
    • array_​keys
    • array_​map
    • array_​merge_​recursive
    • array_​merge
    • array_​multisort
    • array_​pad
    • array_​pop
    • array_​product
    • array_​push
    • array_​rand
    • array_​reduce
    • array_​replace_​recursive
    • array_​replace
    • array_​reverse
    • array_​search
    • array_​shift
    • array_​slice
    • array_​splice
    • array_​sum
    • array_​udiff_​assoc
    • array_​udiff_​uassoc
    • array_​udiff
    • array_​uintersect_​assoc
    • array_​uintersect_​uassoc
    • array_​uintersect
    • array_​unique
    • array_​unshift
    • array_​values
    • array_​walk_​recursive
    • array_​walk
    • array
    • arsort
    • asort
    • compact
    • count
    • current
    • end
    • extract
    • in_​array
    • key_​exists
    • key
    • krsort
    • ksort
    • list
    • natcasesort
    • natsort
    • next
    • pos
    • prev
    • range
    • reset
    • rsort
    • shuffle
    • sizeof
    • sort
    • uasort
    • uksort
    • usort
    • each
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *