【问题标题】:php array search from multidimensional array by single or multiple wordphp数组通过单个或多个单词从多维数组中搜索
【发布时间】:2018-04-17 22:28:21
【问题描述】:

我有一个多维数组。我想使用其中的单字或双字在数组中搜索并返回包含任何匹配字的数组...

这是我的示例数组:

$array = array(
            array('First_name' => 'Dina', 'Last_Name' => 'Gomez', 'Location' => 'Los Angeles, CA', 'Work' => 'Youtube Service')
            array('First_name' => 'Lopa', 'Last_Name' => 'Mitchel', 'Location' => 'New York, NY', 'Work' => 'Works with Mark')
            array('First_name' => 'Mark ', 'Last_Name' => 'Nailson Jr.', 'Location' => 'Dallas, USA', 'Work' => 'SEO Industry')
            array('First_name' => 'Jenna', 'Last_Name' => 'Gomez', 'Location' => 'Florida, CA', 'Work' => 'Work at Youtube')
            );

现在如果有人搜索“Gomez”,那么它应该返回第一个和最后一个数组..我可以使用 in_array() 来做到这一点,但问题是,我 in_array() 只返回完全匹配。我也想要部分匹配的内容.. 比如如果有人搜索 "Mark Gomez" 那么它应该返回第一个数组,"Gomez" 的最后一个数组和 "Gomez" 的第二个和第三个数组strong>"Mark" .. 第二个数组在 Work Key 处有 "Mark" 字。

我从另一个 stackoverflow 答案中收集了一个函数.. 它仅适用于完全匹配.. 或仅适用于某些键..

function checkarrayvalues($term, $arr, $strict = false, $partial = false) {
        if ($partial) {  // whether it should perform a partial match
            $fn = ($strict) ? "strpos" : "stripos";
        }
        foreach ($arr as $item) {
            if (is_array($item)) {
                if (checkarrayvalues($term, $item, $strict, $partial))
                    return true;
            } elseif (($partial && call_user_func($fn, $item, $term) !== false) 
                    || ($strict ? $item === $term : $item == $term)) {
                return true;
            }
        }
        return false;
    }

    var_dump(checkarrayvalues($query, $results, false, true));

我也尝试了array_search 函数:( 没有运气。

请帮忙:(

【问题讨论】:

  • 您研究过 ElasticSearch 吗?这是它擅长的。
  • 您的函数 checkarrayvalues() 返回一个布尔值。您要返回数据还是布尔值?
  • 目前我想要布尔值.. 但我稍后会用它来显示数据并且我知道该怎么做
  • @IAmStack 这个问题你还需要答案吗?
  • @Syscall .. 目前我正在使用另一种方法.. 在此处查看我的代码:http://prntscr.com/j71luo 但如果您有任何简单方便的方法,请分享

标签: php arrays


【解决方案1】:

你们很亲密。您可以分解输入项并单独搜索它们以查找数组中的出现。然后,您不能直接返回递归数组的值,因为您会中断循环。您可以使用变量并在循环结束时返回它

这是demo

功能:

function checkarrayvalues(&$out, $terms, $input, $strict = false, $partial = false) {

    if ($partial) {  // whether it should perform a partial match
        $fn = ($strict) ? "strpos" : "stripos";
    }

    $found = false ;
    foreach ($input as $key => $item) {
        if (is_array($item)) {
            if (checkarrayvalues($out, $terms, $item, $strict, $partial)) {
                $found = true;
            }
        }
        else {
            foreach ($terms as $term) {
                if (($partial && call_user_func($fn, $item, $term) !== false)
                    || ($strict ? $item === $term : $item == $term))
                {
                    $out[] = ['item' => $item, 'key' => $key] ;
                    $found = true;
                }
            }
        }
    }
    return $found;
}

用法:

$array = [
    ['First_name' => 'Dina', 'Last_Name' => 'Gomez', 'Location' => 'Los Angeles, CA', 'Work' => 'Youtube Service'],
    ['First_name' => 'Lopa', 'Last_Name' => 'Mitchel', 'Location' => 'New York, NY', 'Work' => 'Works with Mark'],
    ['First_name' => 'Mark', 'Last_Name' => 'Nailson Jr.', 'Location' => 'Dallas, USA', 'Work' => 'SEO Industry'],
    ['First_name' => 'Jenna', 'Last_Name' => 'Gomez', 'Location' => 'Florida, CA', 'Work' => 'Work at Youtube'],
];


$out = [];
if (checkarrayvalues($out, ["New York"], $array, false, false)) {
    print_r($out);
}
$out = [];
if (checkarrayvalues($out, ["Mark","Gomez"], $array, false, false)) {
    print_r($out);
}
$out = [];
if (checkarrayvalues($out, ["Mark"], $array, false, true)) {
    print_r($out);
}

输出:

Array ( [0] => Array ( [item] => New York, NY [key] => Location ) ) 
Array ( [0] => Array ( [item] => Gomez [key] => Last_Name ) [1] => Array ( [item] => Mark [key] => First_name ) [2] => Array ( [item] => Gomez [key] => Last_Name ) ) 
Array ( [0] => Array ( [item] => Works with Mark [key] => Work ) [1] => Array ( [item] => Mark [key] => First_name ) )

当然,您可以存储 $input 或索引,而不是存储项目。

【讨论】:

  • 感谢您的出色工作。但它无法在 Location, Work 数组中搜索.. 3v4l.org/qYfZE
  • @IAmStack 但是,对于这种情况,您需要部分匹配。但我会更新你的答案。
  • 我需要更多的帮助..如果我搜索“Dina Youtube”,那么它将返回具有 Dina 和 Youtube 两个关键字的最相关数组..& 有没有办法从数组中排除一个键搜索?
猜你喜欢
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多