首页 > 解决方案 > 通过匹配两个数组的值来创建新数组的有效方法

问题描述

我有这个$_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 行。(实际上我还需要将另一个数组匹配到其中,这显然会使其更慢)。脚本运行,但浏览器持续加载一分钟。不幸的是,我需要在浏览器中进行。

有没有更有效的方法?

标签: phparrays

解决方案


根据您的数据结构,您可能会摆脱内部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 产品快得多,但正如其他人所建议的那样,数据库会好得多。


推荐阅读