【问题标题】:Fastest search for more then 300k data array using key=>value in a multidimensional array在多维数组中使用 key=>value 最快搜索超过 300k 的数据数组
【发布时间】:2021-03-11 11:55:23
【问题描述】:

简单示例数组:

$arr = [
    ['id' => 1, 'name' => 'cat 1'],
    ['id' => 2, 'name' => 'cat 2'],
    ['id' => 3, 'name' => 'cat 1']
];

第一个解决方案

public static function searchForCat($array, $k,$value) {
    foreach ($array as $key => $val) {
        if (trim(strtolower($val[$k])) === trim(strtolower($value))) {
            return $val;
        }
    }
    return null;
 }

第二个解决方案

$categoryKey = array_filter($dataArray, function ($cat, $k) use ($value, $key) {
    return
    trim(strtolower($cat[$key])) == trim(strtolower($value));
}, ARRAY_FILTER_USE_BOTH);

第三种解决方案

$key = array_search($product[$staticAttr['Category Name']], array_column($categories, 'name'));
if($key)
$category = $categories[$key];

第四个解决方案

public static function search_array_kv( $array, $key, $value )
{
   
    $results = array();

    if ( !is_array( $array ) ) return;
    foreach ( $array as $array_value )
    {
        if ( !is_array( $array_value ) ) continue;
        foreach ( $array_value as $subarray )
        {
            if ( !isset( $subarray[ $key ] ) ) continue;
            if ( trim(strtolower($subarray[ $key ])) == trim(strtolower($value ))) $results[] = $subarray;
        }
    }
 
    return current($results);
}

我有超过 30 万个类别,我正在迁移 100 万个产品,每个产品都会调用上述搜索三到四次来获取类别、子类别和品牌名称。以上哪种解决方案会更有效?任何快速的解决方案都会非常受欢迎。

【问题讨论】:

  • 您是否对其中任何一个进行了基准测试?
  • @MarkusZeller 第一次尝试了上述所有方法,第三次更好
  • 你也许应该使用数据库和基本的选择查询。
  • @Syscall 无法为单个产品创建三四分贝连接。
  • @mickmackusa ok 将从 db 中添加小写字母。请查看其他部分

标签: php arrays search multidimensional-array


【解决方案1】:
  1. 我不相信在 php 中执行这些迭代检查是理想的技术。

  2. 如果您每次都需要修剪并转换为小写,那么我会说您的数据存储时并没有考虑到搜索。

  3. array_filter() 不会是表现最好的。找到满意的行后会继续搜索。

  4. array_search() 依赖于array_column() 也意味着迭代整个数据集然后搜索返回的列。这很可能表现不佳。 $key 可能是 false0,所以宽松的检查是有缺陷的设计。

  5. 你在第 4 次 sn-p 时失去了我,我不能说我是在拿苹果和苹果比较。

  6. 提早返回的foreach() 很可能表现最好。

  7. 你应该在循环之前声明$value = trim(strtolower($value));,因为它在循环中永远不会改变,这些重复的调用是资源的浪费。

  8. Php 在检查键方面做得很好。如果您能够通过修改数据的存储方式以某种方式利用密钥检查,则性能可能会提高(以内存为代价)。

  9. 就个人而言,我可能会尝试使用具有适当索引的数据库来完成这项任务。

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2011-05-22
    • 1970-01-01
    • 2010-11-04
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多