基于关系数组合并2个数组

时间:2017-01-24 09:54:26

标签: php arrays

我有以下数组:

$excel_arr = array(
         ["C1", "Title 3"],
         ["A1", "Title 1"],
         ["B1", "Title 2"],
         ["D1", "Title 4"]
);
$db_result = array(
         "title_2" => "Cell 2 Value",
         "title_1" => "Cell 1 Value",
         "title_3" => "Cell 3 Value",
         "title_5" => "Cell 5 Value"
);
$excel_db_relation = array(
         "title_1" => "Title 1",
         "title_2" => "Title 2",
         "title_3" => "Title 3",
         "title_4" => "Title 4",
         "title_5" => "Title 5"
);

usort($excel_arr, function ($a, $b) { return strnatcmp($a[0], $b[0]); });
  • $excel_arr是一个数组,其中包含excel文件中每列的标题。第一个单元格定义单元格坐标,第二个单元格定义实际单元格值。

  • $db_result是一个包含数据库查询值的数组。关键是表中的列名。

  • $excel_db_relation是一个数组,用于定义前两个数组之间的关系。哪个excel列链接到哪个db表列。在这个例子中它们非常相似,但实际上可能不仅仅是下划线不同。

$excel_arr中的单元格坐标定义了必须打印每个值的顺序。为此,我使用usort()对数组进行排序,如上所示。

我需要以某种方式合并这些数组,以便生成的数组变为:

array("Title 1" => "Cell 1 Value", "Title 2" => "Cell 2 Value", "Title 3" => "Cell 3 Value")

数据库阵列未返回 cell 4 的值,并且excel表未定义 E5 单元格。因此,这些不得包含在结果数组中。

我已尝试array_merge($excel_db_relation, $db_result)以及array_merge()array_flip()的各种组合,但无论我做什么,我似乎无法合并数组,而“标题X”是关键。

3 个答案:

答案 0 :(得分:2)

使用array_intersect_keyarray_intersectarray_column函数的解决方案:

$result = [];
 // getting concurrent 'titles'(by key)
$titles = array_intersect_key($excel_db_relation, $db_result); 

foreach (array_intersect($titles, array_column($excel_arr, 1)) as $k => $v) {
    $result[$v] = $db_result[$k];
}

print_r($result);

输出:

Array
(
    [Title 1] => Cell 1 Value
    [Title 2] => Cell 2 Value
    [Title 3] => Cell 3 Value
)

<强> 更新
保持必须打印每个值的顺序的替代方法。
使用的函数:array_merge_recursive(将单元格标题和值组合成单独的组)和array_column功能:

$result = [];
$bindings = array_column(array_merge_recursive($db_result, $excel_db_relation), 0, 1);
foreach (array_column($excel_arr, 1) as $title) {
    if (isset($bindings[$title])) $result[$title] = $bindings[$title];
}

print_r($result);

输出:

Array
(
    [Title 3] => Cell 3 Value
    [Title 1] => Cell 1 Value
    [Title 2] => Cell 2 Value
)

答案 1 :(得分:1)

试试这个:

$result = array_flip($excel_db_relation);
array_walk($result, function(&$value, $key) use ($db_result) {
    $value = $db_result[$value];
});
var_dump($result);

但请确保事先存在所有密钥。

答案 2 :(得分:1)

这对我有用:

<?php
//...
usort($excel_arr, function ($a, $b) { return strnatcmp($a[0], $b[0]); });

$result = [];

// traverse the *title* column in the sorted $excel_arr
foreach (array_column($excel_arr, 1) as $a) {

    // could use array_flip to speed up this test, though
    // this can be problematic if the values aren't *good* array keys
    $k = array_search($a, $excel_db_relation);

    // if there is a key and it also exists in $db_result
    if (false !== $k && array_key_exists($k, $db_result)) {

        // assign it to the final result
        $result[$a] = $db_result[$k];
    }
}

print_r($result);