PHP在多维数组中搜索。不知道钥匙

PHP在多维数组中搜索。不知道钥匙,php,Php,数组: $userdb = array( array( 'uid' => '100', 'name' => 'Sandra Shush', 'pic_square' => 'abc.jpg' ), array( 'uid' => '5465', 'name' => 'Stefanie Mcmohn', 'pic_square' => 'Mic

数组:

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'abc.jpg'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'Michael.jpg'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'xyz.jpg'
    )
);
搜索值:

迈克尔

预期产出:

$userdb = array(
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'Michael.jpg'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'xyz.jpg'
    )
);

你可以检查我想要什么,任何人都可以告诉我如何使用PHP实现这个结果。我不在乎我的搜索词是否在'uid'、'name'或'pic_square'键中,但我希望在搜索词结果匹配时获得数组。是否有任何内置功能可以实现此结果

这应该能奏效

foreach($userdb as $i=>$r){
    foreach($r as $j=>$v){
        #if($v matches the querystring)
            #return $r / append $r to a match list
    }
}
但是请注意,因为没有索引和all,这将在O(N^2)中运行,这是最坏的情况

编辑

经过一些研究,提出了以下解决方案

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'abc.jpg'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'Michael.jpg'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'xyz.jpg'
    )
);

$search = "Michael";

$out = array_filter($userdb, function($item) use($search) {
    foreach($item as $k=>$v){
        if(preg_match("/$search/", $v) == 1){
            return true;
        }
    }
});

echo json_encode($out);

该解决方案使用函数(特此确认,这是我进一步研究的指针)使用过滤器减少数组,其中过滤器是对关联数组元素的每个属性执行的。如果找到匹配项,它将返回true,这将把匹配的元素添加到
$out

中,这应该可以做到

foreach($userdb as $i=>$r){
    foreach($r as $j=>$v){
        #if($v matches the querystring)
            #return $r / append $r to a match list
    }
}
但是请注意,因为没有索引和all,这将在O(N^2)中运行,这是最坏的情况

编辑

经过一些研究,提出了以下解决方案

$userdb = array(
    array(
        'uid' => '100',
        'name' => 'Sandra Shush',
        'pic_square' => 'abc.jpg'
    ),
    array(
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'Michael.jpg'
    ),
    array(
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'xyz.jpg'
    )
);

$search = "Michael";

$out = array_filter($userdb, function($item) use($search) {
    foreach($item as $k=>$v){
        if(preg_match("/$search/", $v) == 1){
            return true;
        }
    }
});

echo json_encode($out);
该解决方案使用函数(特此确认,这是我进一步研究的指针)使用过滤器减少数组,其中过滤器是对关联数组元素的每个属性执行的。如果找到匹配项,它将返回true,这将把匹配元素添加到
$out

非常简单的解决方案是使用

1.使用
foreach()

2.检查搜索值是否存在于id、name、pic_square三个
中的任何一个中?如果是,则将整个子数组添加到新数组中

3.这个新阵列是您想要的结果

$search_value = 'Michael';


$final_array = [];

foreach($userdb as $userd){
  if(strpos($userd['uid'],$search_value)!== false || strpos($userd['name'],$search_value)!== false || strpos($userd['pic_square'],$search_value)!== false){

     $final_array[] = $userd;
  }

}

print_r($final_array);
输出:-

非常简单的解决方案是使用

1.使用
foreach()

2.检查搜索值是否存在于id、name、pic_square三个
中的任何一个中?如果是,则将整个子数组添加到新数组中

3.这个新阵列是您想要的结果

$search_value = 'Michael';


$final_array = [];

foreach($userdb as $userd){
  if(strpos($userd['uid'],$search_value)!== false || strpos($userd['name'],$search_value)!== false || strpos($userd['pic_square'],$search_value)!== false){

     $final_array[] = $userd;
  }

}

print_r($final_array);
输出:-

另一种方法是删除与搜索不匹配的元素

$userdb = array(
    array('uid' => '100', 'name' => 'Sandra Shush', 'pic_square' => 'abc.jpg'),
    array('uid' => '5465', 'name' => 'Stefanie Mcmohn', 'pic_square' => 'Michael.jpg'),
    array('uid' => '40489', 'name' => 'Michael', 'pic_square' => 'xyz.jpg')
);

$search = 'Michael';
$out = array_filter($userdb, function($item) use($search) {
    return $item['name'] == $search || strpos($item['pic_square'], $search) !== false;
});
print_r($out);
输出:

Array (
    [1] => Array (
            [uid] => 5465
            [name] => Stefanie Mcmohn
            [pic_square] => Michael.jpg
        )
    [2] => Array (
            [uid] => 40489
            [name] => Michael
            [pic_square] => xyz.jpg
        )
)
另一种方法是使用删除与搜索不匹配的元素

$userdb = array(
    array('uid' => '100', 'name' => 'Sandra Shush', 'pic_square' => 'abc.jpg'),
    array('uid' => '5465', 'name' => 'Stefanie Mcmohn', 'pic_square' => 'Michael.jpg'),
    array('uid' => '40489', 'name' => 'Michael', 'pic_square' => 'xyz.jpg')
);

$search = 'Michael';
$out = array_filter($userdb, function($item) use($search) {
    return $item['name'] == $search || strpos($item['pic_square'], $search) !== false;
});
print_r($out);
输出:

Array (
    [1] => Array (
            [uid] => 5465
            [name] => Stefanie Mcmohn
            [pic_square] => Michael.jpg
        )
    [2] => Array (
            [uid] => 40489
            [name] => Michael
            [pic_square] => xyz.jpg
        )
)

您可以使用preg_grep在松散的比较中匹配搜索

$search = "Michael";
Foreach($userdb as $key => $arr){
    If(preg_grep("/" . $search ."/", $arr)){
        $res[] = $userdb[$key];
    }
}

Var_dump($res);
我在数组中循环,如果与preg_grep匹配,它将添加到结果数组中

Preg_grep将搜索整个数组,而不仅仅是硬编码的项目。
这显然是一件好事,也是一件坏事

例如,如果您的数据库使用“alias”键进行扩展,preg_grep将搜索到,而无需更改代码

请参见此处的示例:

您可以使用preg\u grep在松散的比较中匹配搜索

$search = "Michael";
Foreach($userdb as $key => $arr){
    If(preg_grep("/" . $search ."/", $arr)){
        $res[] = $userdb[$key];
    }
}

Var_dump($res);
我在数组中循环,如果与preg_grep匹配,它将添加到结果数组中

Preg_grep将搜索整个数组,而不仅仅是硬编码的项目。
这显然是一件好事,也是一件坏事

例如,如果您的数据库使用“alias”键进行扩展,preg_grep将搜索到,而无需更改代码

请参见此处的示例:


你能展示一下你到目前为止所做的编码工作吗?在我看来,这就像是一个嵌套在另一个
foreach
中的
foreach
。@AlivetoDie我的头脑是空白的,我什么也没试过。请帮帮我。@RomeoSierra,因为元素太多了。@shahrushabh这不是这里的工作方式。你能展示一下你到目前为止所做的编码工作吗?在我看来,这就像是嵌套在另一个
foreach
中的
foreach
。@AlivetoDie我的头脑是空白的,我什么也没试过。请帮帮我。@RomeoSierra,因为元素太多了。@shahrushabh这不是这里的工作方式。
$item['name']==$search
也需要使用
strpos()
,否则它对像
Michael Dominic
这样的名字不起作用。。。。。我只有这个假设。记住我没说你错了,你活着是对的。我在这里使用完全匹配来显示多种可能性。但我认为这个名字的strpos可能更有用。感谢您的评论。
$item['name']==$search
也需要使用
strpos()
,否则它对像
Michael Dominic
这样的名字不起作用。。。。。我只有这个假设。记住我没说你错了,你活着是对的。我在这里使用完全匹配来显示多种可能性。但我认为这个名字的strpos可能更有用。感谢您的评论。2 foreach()完全不是必需的。只有在您确切知道有多少项您已经知道要搜索的所有关键字的情况下,才需要这样做。。你对此投了反对票吗?我只是出于好奇问:)无论如何,对于上面的所有方法,您都需要事先完全了解关键点。如果我们不知道键,或者如果关联数组中的键彼此不同,您可能会遇到麻烦…2 foreach()完全不是必需的。只有在您确切知道有多少项您已经知道要搜索的所有键的情况下,才能这样做。。你对此投了反对票吗?我只是出于好奇问:)无论如何,对于上面的所有方法,您都需要事先完全了解关键点。如果我们不知道关键点,或者如果关联数组中的关键点彼此不同,你可能会遇到麻烦…兄弟,谢谢你的解决方案,但我使用了数组搜索方法,它很快。我也遵循了同样的步骤。@shahrushabh很高兴帮助你:):)兄弟,谢谢你的解决方案,但我使用了数组搜索方法,它很快。跟我走的一样。@shahrushabh g