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

Вот два возможных решения:

Субмодули

Либо копировать репозиторий A в отдельный каталог в более крупном проекте B, либо (возможно, лучше) клонировать репозиторий A в подкаталог в проекте B. Затем используйте git submodule , чтобы сделать этот репозиторий субмодулем репозитория B.

Это хорошее решение для слабосвязанных репозиториев, где разработка в репозитории A продолжается, и основная часть разработки - отдельная автономная разработка в A. См. также SubmoduleSupport и GitSubmoduleTutorial страницы в Git Wiki.

Subtree merge

Вы можете объединить репозиторий A в подкаталог проекта B, используя стратегию слияния поддерева . Это описано в Subtree Merging и You Markus Prinz.

git remote add -f Bproject /path/to/B
git merge -s ours --allow-unrelated-histories --no-commit Bproject/master
git read-tree --prefix=dir-B/ -u Bproject/master
git commit -m "Merge B project as our subdirectory"
git pull -s subtree Bproject master

(Для Git> = 2.9.0 требуется опция --allow-unrelated-histories.)

Или вы можете использовать инструмент поддерева git ( репозиторий на GitHub ) от apenwarr (Avery Pennarun), анонсированный, например, в его сообщении в блоге . Новая альтернатива подмодулям Git: git subtree .


Я думаю, что в вашем случае (A должен быть частью более крупного проекта B) правильным решением было бы использовать слияние поддерева .

12
задан Annan 24 August 2008 в 16:21
поделиться

6 ответов

Это делает что предложенный Erik (идентификатор нет. как ключ массива) и слияния vlaues в $array2 кому: $results.

$results = array();

foreach($array as $subarray)
{
    $results[$subarray['id']] = array('name' => $subarray['name']);
}

foreach($array2 as $subarray)
{
    if(array_key_exists($subarray['id'], $results))
    {
        // Loop through $subarray would go here if you have extra 
        $results[$subarray['id']]['age'] = $subarray['age'];
    }
}
3
ответ дан 2 December 2019 в 07:23
поделиться

@Andy

http://se.php.net/array_merge

Это было моей первой мыслью, но она не вполне работает - однако array_merge_recursive, мог бы работать - слишком ленивый для проверки прямо сейчас.

10
ответ дан 2 December 2019 в 07:23
поделиться

Прежде всего, почему Вы не используете идентификатор в качестве индекса (или ключ, в массиве стиля отображения, что массивы php являются imo)?

$array = array(
    1 => array(
        'name' => 'Cat',
    ),
    2 => array(
        'name' => 'Mouse',
    )
);

после этого Вы будете иметь к foreach через один массив, выполняя array_merge на объектах другого:

foreach($array2 as $key=>$value) {
  if(!is_array($array[$key])) $array[$key] = $value;
  else $array[$key] = array_merge($array[key], $value); 
}

Что-то как этот, по крайней мере. Возможно, существует лучшее решение?

3
ответ дан 2 December 2019 в 07:23
поделиться

@Andy

Я уже посмотрел на это и не видел, как это может помочь объединить многомерные массивы. Возможно, Вы могли дать пример.

@kevin

Это, вероятно, что я должен буду сделать, поскольку я думаю, что код ниже будет очень медленным. Фактический код несколько отличается, потому что я использую ADOdb (и ODBC для другого запроса), но я заставлю его работать и отправить мой собственный ответ.

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

foreach($array as &$animal)
{
    foreach($array2 as $animal2)
    {
        if($animal['id'] === $animal2['id'])
        {
            $animal = array_merge($animal, $animal2);
            break;
        }
    }
}
1
ответ дан 2 December 2019 в 07:23
поделиться
<?php
      $a = array('a' => '1', 'b' => array('t' => '4', 'g' => array('e' => '8')));
      $b = array('c' => '3', 'b' => array('0' => '4', 'g' => array('h' => '5', 'v' => '9')));
      $c = array_merge_recursive($a, $b);
      print_r($c);
?>

array_merge_recursive — Объедините два или больше массива рекурсивно

выводы:

        Array
(
    [a] => 1
    [b] => Array
        (
            [t] => 4
            [g] => Array
                (
                    [e] => 8
                    [h] => 5
                    [v] => 9
                )

            [0] => 4
        )

    [c] => 3
)
3
ответ дан 2 December 2019 в 07:23
поделиться
$new = array();
foreach ($array as $arr) {
    $match = false;
    foreach ($array2 as $arr2) {
        if ($arr['id'] == $arr2['id']) {
           $match = true;
           $new[] = array_merge($arr, $arr2);
           break;
        }
    }
    if ( !$match ) $new[] = $arr;
}
-3
ответ дан 2 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

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