2017-04-05 31 views
2

我有两个数组是这样的:如何合并数组和标识符?

$arr1 = ['yellow' => 1, 'red', => 5]; 
$arr2 = ['gray' => 3, 'black' => 8, 'orange' => 6, 'yellow' => 9]; 

而且我想这样的结果:

$merged = ['yellow' => [1, 'arr1'], 'red', => [5, 'arr1'], 'gray' => [3, 'arr2'], 'black' => [8, 'arr2'], 'orange' => [6, 'arr2'], 'yellow' => [9, 'arr2']]; 

但正如我阅读文档有关array_merge(),它没有这样的选择。有什么功能可以帮我吗?

+0

可以黄色两种ARR1和ARR2找到??或任何颜色 – Vanojx1

+0

@ Vanojx1是的。 。 。 !他们不是唯一的,我需要让他们两个 – stack

回答

2

这可能是你在找什么:

<?php 
$input = [ 
    'arr1' => ['yellow' => 1, 'red' => 5], 
    'arr2' => ['yellow' => 10, 'gray' => 3, 'black' => 8, 'orange' => 6] 
]; 
$output = []; 
array_walk($input, function ($entry, $source) use (&$output) { 
    foreach ($entry as $key=>$val) { 
     $output[$key][] = [$val, $source]; 
    } 
}); 
print_r($output); 

以上代码的输出显然是:

Array 
(
    [yellow] => Array 
     (
      [0] => Array 
       (
        [0] => 1 
        [1] => arr1 
       ) 

      [1] => Array 
       (
        [0] => 10 
        [1] => arr2 
       ) 

     ) 

    [red] => Array 
     (
      [0] => Array 
       (
        [0] => 5 
        [1] => arr1 
       ) 

     ) 

    [gray] => Array 
     (
      [0] => Array 
       (
        [0] => 3 
        [1] => arr2 
       ) 

     ) 

    [black] => Array 
     (
      [0] => Array 
       (
        [0] => 8 
        [1] => arr2 
       ) 

     ) 

    [orange] => Array 
     (
      [0] => Array 
       (
        [0] => 6 
        [1] => arr2 
       ) 

     ) 

) 
+2

的@stack希望你是罚款和发展的事情,你想;-) – arkascha

+1

如果“黄色”出现在两个数组此代码不能正常工作。它不保留这两个值,而是覆盖。 –

+1

@KIKOSoftware在那种情况下会输出什么? –

0

好吧,我花了一点的时间来想出这个答案,因为你的问题中有一个错误。见“”后面‘红色’在阵列1

$arr1 = ['yellow' => 1, 'red' => 5]; 
$arr2 = ['gray' => 3, 'black' => 8, 'yellow' => 3, 'orange' => 6]; 

$arrays = ['arr1','arr2']; 
$merged = []; 

foreach ($arrays as $array) { 
    foreach (${$array} as $color => $value) { 
    $merged[$color][] = [$value,$array]; 
    } 
} 

echo '<pre>'; 
print_r($merged); 
echo '</pre>'; 

为了保持的两个值‘黄色’我介绍了阵列的额外层。否则我不知道如何保留它们。

因此,代码测试和回报:

Array 
(
    [yellow] => Array 
     (
      [0] => Array 
       (
        [0] => 1 
        [1] => arr1 
       ) 
      [1] => Array 
       (
        [0] => 3 
        [1] => arr2 
       ) 
     ) 
    [red] => Array 
     (
      [0] => Array 
       (
        [0] => 5 
        [1] => arr1 
       ) 
     ) 
    [gray] => Array 
     (
      [0] => Array 
       (
        [0] => 3 
        [1] => arr2 
       ) 
     ) 
    [black] => Array 
     (
      [0] => Array 
       (
        [0] => 8 
        [1] => arr2 
       ) 
     ) 
    [orange] => Array 
     (
      [0] => Array 
       (
        [0] => 6 
        [1] => arr2 
       ) 
     ) 
) 
0

基于@arkascha回答这个处理重复一个版本:

<?php 
    $input = [ 
    'arr1'=> ['yellow' => 1,'red' => 5, 'black' => 4], 
    'arr2'=> ['gray' => 3,'yellow' => 3, 'black' => 8,'orange' => 6], 
    'arr3'=> ['orange' => 2] 
    ]; 

    $output = []; 
    array_walk($input, function ($entry, $source) use (&$output) { 
    foreach ($entry as $key=>$val) { 
     if(!array_key_exists($key, $output)) 
     $output[$key] = [[$val, $source]]; 
     else 
     $output[$key][] = [$val, $source]; 
    } 
    }); 

    echo print_r($output); 

?> 

PHP FIDDLE