我有以下数组:
$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”是关键。
答案 0 :(得分:2)
使用array_intersect_key
,array_intersect
和array_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);