搜索2d数组以查找多个字符串的完全匹配

时间:2017-09-06 08:15:47

标签: php

不确定我是否接近这个最佳方式,可能不是。

我有一个名为$ search的数组,其元素为'dog'和'cat'。我想搜索名为$ array的2d数组,并存储每行的第一个元素(它的数字),如果该行包含'dog'和'cat'的元素。到目前为止我有这个:

//create 2d array
$array = array(
    array(1, 'dog', 'cat','sup'),
    array(2, 'dog', 'fish', 'cow'),
    array(3, 'dog', 'cat'),
    array(4, 'monkey', 'rabbit', 'king', 'fish', 'duck')
);

//create user search array
$search = array('dog', 'cat');

//create get results array:
$results = array();

//get rows with matches of user search and push to results array:
$rows = count($array);
for ($row = 0; $row < $rows; $row++) {
    $cols = count($array[$row]);
    for($col = 0; $col < $cols; $col++ ) {
        for($i = 0; $i < $cols; $i++){
            if($search[$i] == $array[$row][$col]){
                //not sure what to do here...
                array_push($results, $array[$row][0]);
                //... 
            }
        }
    }
}

//check results
var_dump($results);

所以,我希望只将这些行推送到结果数组:

array(1, 'dog', 'cat','sup'),
array(3, 'dog', 'cat')

看起来像:

array (size=2)
  0 => int 1
  1 => int 3

3 个答案:

答案 0 :(得分:1)

不要对数组使用for循环,请使用专为此任务设计的foreach

如果使用$array和{{1将搜索数组的大小与$array项目与搜索数组之间的交集大小进行比较,您可以找到所需的array_intersect项目}}:

count

demo

答案 1 :(得分:0)

只需从$array中取一个项目,然后检查它是否包含来自$search的所有值。

示例:

foreach ($array as $item) {
    foreach ($search as $sItem) {
        if (!in_array($sItem, $item))
            continue 2;
    }
    $results[] = $item[0];
}

答案 2 :(得分:0)

您可以使用.*功能

来实现此目的

用此

替换for循环
in_array

结果将是

//get rows with matches of user search and push to results array:
for($i=0;$i<sizeof($array);$i++){
  for($j=0;$j<sizeof($search);$j++){
  if (!in_array($search[$j], $array[$i]))
    continue 2;
  }
 $results[] = $array[$i][0];
}
//check results
var_dump($results);