PHP循环和返回多维数组的$key

4
我正在尝试编写一个PHP函数来循环遍历多维数组,将其与商业名称匹配,然后返回“商业类型”。
根据我的目前技能,我编写了此功能,但我想知道除了循环两次之外是否有更好的解决方案,因为我的真实数组比下面的示例要大得多。
注:我是一名学生,我已经在StackOverflow上搜索过了,但没有找到我需要的答案。
function find_business_type($dealer_name) {
    $business_type = [
        "OEM"               => ["kia", "mercedes"],
        "Rent"              => ["rent", "rent-a-car"],
        "Workshop"          => ["shop", "workshop"],
        "Spare Parts"       => ["spare", "parts", "part"],
        "General Trading"   => ["gen", "general"]
    ];

    foreach ($business_type as $key => $values) {
        foreach ($values as $value) {
            if (strpos($dealer_name, $value) !== false) {
                return $key;
            }
        }
    }
}


$my_dealer = "super-stars-123 rent a car";
echo find_business_type($my_dealer);

输出结果:"租赁"

1
当经销商名称包含多个业务类型的关键字时,这种方法就会失效。最好将关键字添加到一个数组中,在完成所有循环后再返回生成的数组。 - jeroen
1
在这种情况下,你的输出应该是“租金”对吗? - Nawin
3
为了演示Jeroen的意思:假设你的经销商名字是“梅赛德斯租车”。你的函数将返回“OEM”,因为它是第一个匹配项。但是,“租车”也可以匹配成功。这就是为什么Jeroen建议返回一个包含“OEM”和“租车”的数组。 - kscherrer
1
@Cashbee,我明白了,这是由于我的经销商名称造成的漏洞,我会修复它,但是我的问题是是否有一种更好的方法/函数,而不是在循环内部循环? - Salam
1
@Salam 提高性能的唯一可靠方法是将您的 $business_type 转换为某种可以更快搜索的结构。有许多方法可以做到这一点,但最终如果您必须在每个搜索过程中执行此操作,则会损失更多性能,因此您必须缓存它或使用特殊数据库,具体取决于数据的大小和更改频率,可能不值得这么多努力。因为它会变得更加复杂。尽管如此,我建议在 Code Review 上提问。 :) - xander
显示剩余13条评论
1个回答

3

这里有一个想法。基本上,您可以根据百分比筛选数组并获取与您的字符串匹配的所有行。请注意,array_filter将返回包含所有匹配值的数组而不仅仅是一个匹配。

    <?php

$dealer = "super-stars-123 rent a car";

$types = [
        "OEM"               => ["kia", "mercedes"],
        "Stars"             => ["super-stars", "123"],
        "Brown"             => ["super stars", "abc"],
        "Home"              => ["think rent", "123"],
        "Super"             => ["renter", "car"],
        "Rent"              => ["rent", "rent-a-car"],
        "Workshop"          => ["shop", "workshop"],
        "Spare Parts"       => ["spare", "parts", "part"],
        "General Trading"   => ["gen", "general"]
    ];

// Filter through your array
$results = array_filter($types, function($type) use ($dealer) {
    // explode your inner array to a string and then try to match it
    // to your search dealer text. This returns a % match.
    // I would play around with this algo logic below to get it to do what you want.
    return (similar_text($dealer, implode(", ",$type), $percent) >= 8);
});

var_dump($results);   

 array (size=4)
  'Stars' => 
    array (size=2)
      0 => string 'super-stars' (length=11)
      1 => string '123' (length=3)
  'Brown' => 
    array (size=2)
      0 => string 'super stars' (length=11)
      1 => string 'abc' (length=3)
  'Super' => 
    array (size=2)
      0 => string 'renter' (length=6)
      1 => string 'car' (length=3)
  'Rent' => 
    array (size=2)
      0 => string 'rent' (length=4)
      1 => string 'rent-a-car' (length=10)

1
我喜欢 similar_text,但也许在你的问题中使用 strpos 的更好方法。 - Kevin Pimentel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接