php - 通过匹配两个数组的值来创建新数组的有效方法
问题描述
我有这个$_SESSION['Products']
来自数据库的数组:
Array (
[0] => Array ( [entity_id] => 1 [sku] => 0001 )
[1] => Array ( [entity_id] => 2 [sku] => 0002 )
)
这个列表$data
来自一个 txt 文件(见下面的 while 循环):
Array ( [0] => 0001 [1] => ABC [2] => 0 [3] => 1.0000 [4] => 25.9400 )
Array ( [0] => 0002 [1] => CDE [2] => 0 [3] => 1.0000 [4] => 28.6600 )
Array ( [0] => 0003 [1] => EFG [2] => 0 [3] => 1.0000 [4] => 30.9900 )
我需要sku
从$_SESSION['Products']
与[0]
从匹配$data
并添加entity_id
匹配。
这是我到目前为止所拥有的,它正在工作:
//read txt file
do {
$line = fgets($handle);
if ($line !== false) {
//explode data
$data = explode(";", $line);
}
foreach ($_SESSION['Products'] as $p) {
if ($p["sku"] === $data[0]) {
$data[5] = $p["entity_id"];
}
}
} while ($line !== false);
输出:
Array (
[0] => Array ( [0] => 0001 [1] => ABC [2] => [3] => 1.0000 [4] => 25.9400 [5] => 1 )
[1] => Array ( [0] => 0002 [1] => CDE [2] => [3] => 1.0000 [4] => 28.6600 [5] => 2 )
)
不过,最大的问题是性能。$_SESSION['Products']
最多可以有 7k 个条目,其中$data
有 10k 行。(实际上我还需要将另一个数组匹配到其中,这显然会使其更慢)。脚本运行,但浏览器持续加载一分钟。不幸的是,我需要在浏览器中进行。
有没有更有效的方法?
解决方案
根据您的数据结构,您可能会摆脱内部foreach
,这将通过首先规范化$_SESSION
数据来节省一些处理时间:
//create array with index = sku
$productSession = array();
foreach ($_SESSION['Products'] as $p) {
$productSession[$p['sku']] = $p;
}
//read txt file
do {
$line = fgets($handle);
if ($line !== false) {
//explode data
$data = explode(";", $line);
}
if (isset($productSession[$data[0]])) { //check for array key instead of a foreach
$data[5] = $productSession[$data[0]]["entity_id"];
}
} while ($line !== false);
这isset()
将比为 csv 中的每一行循环 7k 产品快得多,但正如其他人所建议的那样,数据库会好得多。
推荐阅读
- javascript - Google Sheet - 脚本很慢
- linux - 不是来自存储库的 Ubuntu 包管理
- php - 通过 API 向 Pipedrive 添加文件;我错过了什么??(PHP)
- azure - 如何在 blazor 中处理登录失败错误?
- python - 获取 ValueError:无法为张量“占位符”提供形状 (506, 1) 的值?
- python - 在 Python 中将多个项目复制到剪贴板
- amazon-web-services - npm 好慢,连 npm -v 都需要 30sec
- java - 我们可以使用 BufferedReader 读取文件并使用 BufferedOutputStream 将内容写入另一个文件吗?反之亦然
- python - 我有两个数据框 df1 和 df2,我需要使用 df2 中的键过滤掉 df1,使用 df2 中的开始日期和结束日期,我需要得到像 df3 这样的结果
- ios - 无法在使用 Agora iOS SDK 的模拟器上运行我的应用