【问题标题】:Filter array to retain all elements that have a key containing a searched string过滤数组以保留所有具有包含搜索字符串的键的元素
【发布时间】:2022-01-19 07:12:42
【问题描述】:

我正在尝试进行一些预测性搜索,并且我正在使用preg_grep() 作为摆脱 SQL 中 LIKE 的一种方式。

我有以下数组:

$values = array("Phorce" => 123, "Billy" => 234);

如果我有Phorc,我想要所有数组元素(键和值),部分匹配Phorc,所以这里是Phorce => 123preg_grep() 可以做到这一点吗?

我已尝试使用以下内容:

$result = preg_grep('~' . 'Phorce' . '~', $values);

如何让我的代码按上述方式工作?

【问题讨论】:

  • 添加你尝试过的代码。
  • 让我更好地了解您在做什么。如果一个表包含 1,000 行,你将把它们全部获取...然后在 PHP 中过滤它们,而不是用 SQL 过滤它们?
  • @Augwa 我已经更新了。
  • @Phorce 没有回答我的问题。为什么要避免 SQL 中的 LIKE?
  • @Augwa 而不是使用 SQL。我有一个值(名称)数组,每个值都有一个 id 所以Phorce => 1234 我想要做的是,在这个数组中搜索包含例如Phor 的所有可能性,所以如果有人传入这个值,然后它会返回Phorce

标签: php substring key filtering


【解决方案1】:

那么你想搜索密钥吗?

$values = array("Phorce" => 123, "Billy" => 234);
$results = preg_grep('/Phor/', array_keys($values));

$arr = [];
foreach($results as $result) {
    $arr[$result] = $values[$result];
}

print_r($arr);

【讨论】:

  • 谢谢!这有效:)!唯一的问题是,我想返回键值以及键? ..这似乎只给出键而不是值
  • @Rizier123 答案就是这样做的,但我会更新我的,使其也包含它们。
  • 这个答案中的循环太多。使用 Rizier 的非正则表达式过滤器。
【解决方案2】:

这应该适合你:

这里我只是使用array_filter() 结合stripos() 来搜索每个数组键是否包含搜索值。

<?php

    $array = array("Phorce" => 123, "Billy" => 234);

    $search = "Phor";
    $arr = array_filter($array, function($k)use($search){
        return stripos($k, $search) !== FALSE;
    }, ARRAY_FILTER_USE_KEY);

    print_r($arr);

?>

输出:

Array
(
    [Phorce] => 123
) 

在有人说它不起作用之前:你需要 PHP 5.6,所以如果你没有那个升级!

【讨论】:

  • 我找不到一个可以关闭的骗子。也许更新您的答案以在 PHP8 中提及 str_contains()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多