【问题标题】:PHP merge two arrays on the same keyPHP在同一个键上合并两个数组
【发布时间】:2013-12-11 09:33:38
【问题描述】:

我的两个数组是这样设置的。

第一个数组

Array
(
    [0] => Array
        (
            [manufacture] => Moto
            [name] => ZSX 125
            [code] => ZS125-48A
            [cc] => 125
            [bike_type] => 3 Motorcycle
            [title] => Mto ZSX 125 
            [about] => The ZSX 
        )

    [1] => Array
        (
            [manufacture] => Moto
            [name] => LSM 125
            [code] => STR125YB
            [cc] => 125
            [bike_type] => 6 Endurancemotor
            [title] => Moto 
            [about] => Moto 
        )
)

第二个数组

Array
(
    [0] => Array
        (
            [id] => 183
            [model] => ZS125-48A
            [engine_brand] => 158FMI-B
            [engine_type] => Single Cylinder
        )

    [1] => Array
        (
            [id] => 172
            [model] => STR125YB
            [engine_brand] => K154FMI
            [engine_type] => Single Cylinder
        )
)

如您所见,第一个数组中的“代码”与第二个数组中的“模型”相同,并且总会有匹配项。

这是我想要的数组。

Array
(
    [0] => Array
        (
            [id] => 183
            [model] => ZS125-48A
            [engine_brand] => 158FMI-B
            [engine_type] => Single Cylinder
            [manufacture] => Moto
            [name] => ZSX 125
            [code] => ZS125-48A
            [cc] => 125
            [bike_type] => 3 Motorcycle
            [title] => Moto ZSX 125 
            [about] => The ZSX 
        )

    [1] => Array
        (
            [id] => 172
            [model] => STR125YB
            [engine_brand] => K154FMI
            [engine_type] => Single Cylinder
            [manufacture] => Moto
            [name] => LSM 125
            [code] => STR125YB
            [cc] => 125
            [bike_type] => 6 Endurancemotor
            [title] => Moto 
            [about] => Moto 
        )
)

这可能吗?我试过array_merge和array_merge_recursive,但它只将第二个数组附加到第一个数组的末尾,它不会将它合并到键上。

【问题讨论】:

  • 在我看来,这就像从 DB 中提取的东西。如果是这样,在列model 上加入结果将不会更容易

标签: php arrays multidimensional-array array-merge


【解决方案1】:

如果两个数组同步,Deceze 的解决方案是完美的(即匹配 codemodel 的项目在两个数组中的索引相同)。如果不是这样,您将需要不止一行代码。

数组需要有字符串键才能与array_merge 合并。在这种情况下,您希望根据code 重新设置第一个密钥,并根据model 重新设置第二个密钥。重新生成密钥后,您可以将它们与array_merge_recursive 合并。

在 PHP 5.5+ 中重新输入密钥很容易:

// array_column will conveniently rekey when the second argument is null
$array1 = array_column($array1, null, 'code');
$array2 = array_column($array2, null, 'model');

在早期版本中稍微复杂一点:

// array_map is a more complicated way to extract a column from an array
// and array_combine will do the rekeying
$array1 = array_combine(
              array_map(function($i) { return $i['code']; }, $array1),
              $array1);
$array2 = array_combine(
              array_map(function($i) { return $i['model']; }, $array2),
              $array2);

在这两种情况下,最后一步都是相同的:

$result = array_merge_recursive($array1, $array2);

【讨论】:

  • +1 以获得详细解释和解决方案 :) 我认为这些数组是同步的,在我看来它们就像从 DB 中提取的一样,这让我认为 OP 可以在 MODEL=>CODE 上加入结果直接在选择时,但这只是一个疯狂的猜测:)
【解决方案2】:

在我看来应该这样做:

$array3 = array_map('array_merge', $array1, $array2);

这会将$array1[0]$array2[0] 提供给array_merge,然后是$array1[1]$array2[1] 等。

【讨论】:

  • 没关系,但要满足OP的全部要求,它应该是$array3 = array_map('array_merge', $array2, $array1);,所以带有ID键的array2将被前置。来自我的 +1
【解决方案3】:

而且,如果您更喜欢“更简单”的代码... :-)

$result = array();
foreach ($one as $a) {
    foreach ($two as $b) {
        if ($a->code == $b->model) {
           array_push($result, array_merge($a, $b));
           break;
        }
    }
}
print_r($result);

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多