@draaax

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

Здравствуйте. Есть 2 массива, можно ли их объединить в один так, чтобы получилось как указал в результате?

1 массив:
$array1 = [
	'ru' => [
		'lang' => [
			'goods' => [
				'товар',
				'товара',
				'товаров'
			],
			'main' => [
				'title' => 'Title',
				'description' => 'Description'
			]
		]
	]
];


2 массив:
$array2 = [
	'en' => [
		'lang' => [
			'goods' => [
				'товар',
				'товара',
				'товаров'
			],
			'main' => [
				'title' => 'My Title',
				'description' => 'My Description'
			]
		]
	]
];


Результат:
$result = [
	'lang' => [
		'goods' => [
			'ru' => [
				'товар',
				'товара',
				'товаров'
			],
			'en' => [
				'товар',
				'товара',
				'товаров'
			]
		],
		'main' => [
			'title' => [
				'ru' => 'Title',
				'en' => 'My Title'
			],
			'description' => [
				'ru' => 'Description',
				'en' => 'My Description'
			]
		]
	]
];
  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
winbackgo
@winbackgo
$result = ['lang' => []];
foreach ([$array1, $array2] AS $ar) {
	foreach ($ar AS $lang => $data) {
		foreach ($data['lang'] AS $k => $v) {
			switch ($k) {
				case 'goods':
					$result['lang'][$k][$lang] = $v;
					break;
				default:
					foreach ($v AS $key => $description) {
						$result['lang'][$k][$key][$lang] = $description;
					}
			}
		}
	}
}
Ответ написан
0xD34F
@0xD34F
function walk($data, $key, &$result) {
  foreach ($data as $k => $v) {
    if (!array_key_exists($k, $result)) {
      $result[$k] = [];
    }

    if (!is_array($v) || array_keys($v) === range(0, count($v) - 1)) {
      $result[$k][$key] = $v;
    } else {
      walk($v, $key, $result[$k]);
    }
  }
}

function merge(...$arrays) {
  $result = [];

  foreach ($arrays as $arr) {
    $key = array_keys($arr)[0];
    walk($arr[$key], $key, $result);
  }

  return $result;
}

$result = merge($array1, $array2);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
$result = [
  'lang' => [
    'goods' => [
      'ru' => $array1['ru']['lang']['goods'],
      'en' => $array2['en']['lang']['goods'],
    ],
    'main' => [
      'title' => [
        'ru' => $array1['ru']['lang']['main']['title'],
        'en' => $array2['en']['lang']['main']['title'],
      ],
      'description' => [
        'ru' => $array1['ru']['lang']['main']['description'],
        'en' => $array2['en']['lang']['main']['description']
      ]
   ]
];

Почти GIGO.
Ответ написан
Комментировать
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
$result = [
  'lang' => [
    'goods' => [
      'ru' => $array1['ru']['lang']['goods'],
      'en' => $array2['en']['lang']['goods']
    ],
    'main' => [
      'title' => [
        'ru' => $array1['ru']['lang']['main']['title'],
        'en' => $array2['en']['lang']['main']['title']
      ],
      'description' => [
        'ru' => $array1['ru']['lang']['main']['description'],
        'en' => $array2['en']['lang']['main']['description']
      ]
    ]
  ]
];

Так норм? :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы