Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Слить два массива
Форумы портала PHP.SU » » Вопросы новичков » Слить два массива

Страниц (1): [1]
 

1. dubasua - 12 Января, 2013 - 12:07:49 - перейти к сообщению
Доброго времени суток.
Нужно слить два многомерный массива так: если ключи совпадают, то нужно перезаписать из второго. Например
PHP:
скопировать код в буфер обмена
  1. $arr1['bond'][34] = 'enyVal';
  2. $arr1['bond'][35] = 'enyVal';
  3.  
  4. $arr2['bond'][34] = 'myVal';
  5.  
  6. //на выходе нужно получить
  7. $arr1['bond'][34] = 'myVal';
  8. $arr1['bond'][35] = 'enyVal';
  9.  
  10. //array_merge_recursive - не подойдет
  11.  
  12. /* и еще условие, ключи 'bond' и '34' динамические,
  13. то есть они неизвестные
  14. */


Уже пол часа голову ломаю...
2. sKaa - 12 Января, 2013 - 12:13:26 - перейти к сообщению
перебери циклом и перезапиши из второго массива.

PHP:
скопировать код в буфер обмена
  1. foreach($arr2['bond'] as $key => $val){
  2.   $arr1['bond'][$key] = $val;
  3. }
3. dubasua - 12 Января, 2013 - 12:15:18 - перейти к сообщению
dubasua пишет:
/* и еще условие, ключи 'bond' и '34' динамические,
то есть они неизвестные
*/
4. sKaa - 12 Января, 2013 - 12:15:57 - перейти к сообщению
рекурсивная функция перебора массива
5. LIME - 12 Января, 2013 - 12:18:29 - перейти к сообщению
http://www.php.su/array_replace_recursive " target="_blank">array_replace_recursive
>= 5.3.0
6. Vaio - 12 Января, 2013 - 12:22:53 - перейти к сообщению
7. LIME - 12 Января, 2013 - 12:27:18 - перейти к сообщению
Vaio таким образом будет замена только первого уровня вложенности
(Добавление)
более того
Цитата:
Оператор + возвращает левый массив, к которому был присоединен правый массив. Для ключей, которые существуют в обоих массивах, будут использованы значения из левого массива, а соответствующие им элементы из правого массива будут проигнорированы.
8. dubasua - 12 Января, 2013 - 12:30:32 - перейти к сообщению
Вот что у меня получилось
PHP:
скопировать код в буфер обмена
  1.  
  2. private function mergeArrs($arr1,$arr2) {
  3.                
  4.         if (is_array(&$arr1)){
  5.                        
  6.                 foreach($arr1 as $key=>$val){
  7.                                
  8.                         if (is_array($val) AND isset($arr2[$key]) AND is_array($arr2[$key])){
  9.                                 $this->mergeArrs($val,$arr2[$key]);
  10.                                 continue;
  11.                         }
  12.                                
  13.                         if (isset($arr2[$key]))
  14.                                 $arr1[$key] = $arr2[$key];
  15.                                                        
  16.                 }// end foreach
  17.                        
  18.         return $arr1;
  19.                        
  20. }
  21.                
  22.         }
  23.  

(Добавление)
Погаричился..... Не работатет.
(Добавление)
Подправил, вот так работает
PHP:
скопировать код в буфер обмена
  1.  
  2. private function mergeArrs(&$arr1,$arr2) {
  3.                
  4. if (is_array($arr1)){
  5.                
  6.         foreach($arr1 as $key=>&$val){
  7.                                
  8.                 if (is_array($val) AND isset($arr2[$key]) AND is_array($arr2[$key])){
  9.                         $val = $this->mergeArrs($val,$arr2[$key]);
  10.                         continue;
  11.                 }
  12.                                
  13.                 if (isset($arr2[$key]))
  14.                         $arr1[$key] = $arr2[$key];
  15.                                                        
  16.                 }// end foreach
  17.                        
  18.                 return $arr1;
  19.                        
  20.         }
  21.                
  22. }
  23.  
  24.  
  25.  
  26.  

 

Powered by ExBB FM 1.0 RC1