2017-09-06 49 views
1

不完全确定我是否接近此最佳方式,可能不是。搜索2d数组以获得多个字符串的精确匹配

我有一个名为$ search的数组,其中包含元素'dog'和'cat'。我想搜索名为$ array的二维数组,并存储每行的第一个元素(它的数字),如果该行具有“狗”和“猫”的元素。我有这个至今:

//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 

回答

0

就拿一个来自$array的项目,并检查它是否包含来自$search的所有值。

例子:

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

这似乎运作良好。谢谢 ! – kaiwen

+0

良好的逻辑..来了解不同之处b/w继续和打破 –

+0

当搜索数组包含多次相同的项目时,此方法不起作用。 –

0

你可以做到这一点使用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); 

循环的结果将是

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

很好用。谢谢! – kaiwen

+0

把答案投给了! –

1

不要使用for循环使用数组,使用foreach这是专为这个任务。

你可以找到你想要$array项目如果使用array_intersectcount比较$array项目和搜索阵列之间的交集的大小搜索数组的大小:

$array = [ 
    [1, 'dog', 'cat','sup'], 
    [2, 'dog', 'fish', 'cow'], 
    [3, 'dog', 'cat'], 
    [4, 'monkey', 'rabbit', 'king', 'fish', 'duck'] 
]; 

$search = [ 'dog', 'cat']; 
$size_search = count($search); 
$store = []; 

foreach ($array as $v) { 
    if (count(array_intersect($search, $v)) == $size_search) 
     $store[] = $v[0]; 
} 

print_r($store); 

demo

+0

非常感谢! – kaiwen