2015-02-09 31 views
1

我有三个阵列(是关于数据迁移)合并3个阵列以一个基座上场

$a = Array 
    (
     [0] => Array 
     (
      [0] => province 
      [1] => 701 
      [2] => AA 
      [3] => A 
     ) 
    .. 
) 
$b = Array 
(
    [0] => Array 
     (
      [0] => district 
      [1] => 70101 
      [2] => BB 
      [3] => B 
     ) 
    [1] => Array 
     (
      [0] => district 
      [1] => 70102 
      [2] => BB1 
      [3] => B1 
     ) 
    .. 
) 


$c = Array 
(
    [0] => Array 
     (
      [0] => commune 
      [1] => 7010101 
      [2] => CC 
      [3] => C 
     ), 
    [1] => Array 
     (
      [0] => commune 
      [1] => 7010102 
      [2] => CC1 
      [3] => C1 
     ) 
.. 
) 

我想是合并所有$a$b, 7010101`

所以最后阵列可以是这个样子:

$d = array (
       701=>array(
         70101=>array(7010101,7010102), 
         70102=>array(7010201,7010202), 
        ), 
      ) 
+0

什么是你的问题?你试过什么了?如果你的问题是如何做到这一点 - 我想 - 然后你只需要遍历3个数组,并检查(区,公社)的键是否包含在上面的类别例如对于一个分区,你会检查密钥是否以比省数字相同的3位开始 - >如果是这样:填充你的缓冲区元素 - >与公社/区相同。 – 2015-02-09 09:12:32

+0

我想用if(strpos($ a,'701')!== false){ //做点什么 } – kn3l 2015-02-09 09:19:48

+0

你不能在数组上应用strpos。它的字符串。 – 2015-02-09 09:24:43

回答

2

的在诱惑是这样的:

# Your data structure here: 
$a = array(
    '701' => 'foo', 
    '702' => 'bar', 
); 

$b = array(
    '70101' => 'foo-foo', 
    '70102' => 'foo-bar', 
); 

$c = array(
    '7010101' => 'foo-foo-foo', 
    '7010102' => 'foo-foo-bar', 
    '7020101' => 'bar-foo-foo', 
    '7020201' => 'bar-bar-foo', 
); 

# The array you want 
$buffer = array(); 

# Loop through the deepest elements (here: commune) 
foreach ($c as $key => $value) { 
    # Find the keys for the parent groups 
    $province_key = substr($key, 0, 3); 
    $district_key = substr($key, 0, 5); 

    # Fill the buffer 
    $buffer[$province_key][$district_key][$key] = $value; 
} 

# Debug: The generated array 
echo '<pre>'; 
print_r($buffer); 
echo '</pre>'; 

您可以复制&粘贴here和命中运行。

0

测试数据:

$arrayA = [ 
    [ 
     0 => 'province', 
     1 => 701, 
     2 => 'AA', 
     3 => 'A' 
    ], 
    [ 
     0 => 'province', 
     1 => 702, 
     2 => 'AA1', 
     3 => 'A1' 
    ], 
]; 
$arrayB = [ 
    [ 
     0 => 'district', 
     1 => 70102, 
     2 => 'BB', 
     3 => 'B' 
    ], 
    [ 
     0 => 'district', 
     1 => 70101, 
     2 => 'BB1', 
     3 => 'B1' 
    ], 
]; 
$arrayC = [ 
    [ 
     0 => 'commune', 
     1 => 7010101, 
     2 => 'CC', 
     3 => 'C' 
    ], 
    [ 
     0 => 'commune', 
     1 => 7010102, 
     2 => 'CC1', 
     3 => 'C1' 
    ] 
]; 

解决方案:

function mergeArraysToOneOnField(array $arrayA, array $arrayB, array $arrayC, $fieldName) { 
    $result = []; 
    /* 
    checks like 
     !is_string($fieldName) && !is_integer($fieldName) 
    */ 
    $arrayARelevantFields = array_column($arrayA, $fieldName); 
    $arrayBRelevantFields = array_column($arrayB, $fieldName); 
    $arrayCRelevantFields = array_column($arrayC, $fieldName); 
    foreach ($arrayARelevantFields as $arrayARelevantField) { 
     $arrayAFilteredRelevantField = filterArrayByStrpos($arrayBRelevantFields, $arrayARelevantField); 
     foreach ($arrayAFilteredRelevantField as $arrayBRelevantField) { 
      $result[$arrayARelevantField][$arrayBRelevantField] = 
       filterArrayByStrpos($arrayCRelevantFields, $arrayBRelevantField) 
      ; 
     } 
    } 
    return $result; 
} 

试运行:

$mergedArray = mergeArraysToOneOnField($arrayA, $arrayB, $arrayC, 1); 
print_r($mergedArray); 

测试结果:

Array 
(
    [701] => Array 
     (
      [70102] => Array 
       (
       ) 

      [70101] => Array 
       (
        [0] => 7010101 
        [1] => 7010102 
       ) 

     ) 

) 

该解决方案可以用递归扩展,以hanlde可变数量输入数组:

function mergeArraysToOneOnField(array &resultArray, array $inputAarray, $field) { 
    ... 
} 
-1
$array1 = array("color" => "red", 2, 4); 
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); 
$result = array_merge($array1, $array2); 

输出

Array ([color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => trapezoid [4] => 4) 
+0

这是'array_merge(...)'的一个很好的例子,但不是问题中描述的问题的解决方案。 -1 – automatix 2015-02-09 15:09:16