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

时间:2018-05-02 05:40:54

标签: php

数组:

$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'键中,但是每当我的搜索词结果匹配时我想得到数组。是否有任何可以实现此结果的内置功能?

4 个答案:

答案 0 :(得分:3)

另一种方法是使用array_filter()删除与您的搜索不匹配的元素。

$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
        )
)

答案 1 :(得分:1)

非常简单的解决方案 ,可以将简单的foreach()应用于strpos()

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);

输出: - https://eval.in/997896

答案 2 :(得分:1)

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

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

Var_dump($res);

我循环遍历数组,如果与preg_grep匹配,则将其添加到结果数组中。

https://3v4l.org/BPJBC

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

例如,如果您的数据库扩展为'别名' key preg_grep将搜索它而无需更改代码。

见这里的例子:
https://3v4l.org/lOao3

答案 3 :(得分:0)

这应该可以解决问题。

foreach($userdb as $i=>$r){
    foreach($r as $j=>$v){
        #if($v matches the querystring)
            #return $r / append $r to a match list
    }
}

注意,因为没有索引和全部,这将在 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);

解决方案使用array_filter函数(Syscall's answer在此得到承认,这是我进一步研究array_filter的指针)以使用过滤器减少数组,其中过滤器是在关联数组元素的每个属性上执行preg_match。如果找到匹配项,则返回true,这会将匹配元素添加到$out