2010-03-06 68 views
0

第一个数组叫做$ related_docs,第二个数组是$ all_docs。我试图将第一个数组中的“1”值与第二个数组中的“1”值相匹配。php in_array()不匹配

Array 
(
    [0] => 1 
) 
Array 
(
    [0] => Array 
     (
      [id] => 1 
      [type_name] => bla1 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [type_name] => bla2 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [type_name] => bla3 
     ) 
    ) 

我想看看是否从第一阵列的任何值出现在第二阵列,这确实在,但脚本打印出什么,但“不”。这是为什么?我试图将if()语句中的$ all_docs更改为$ a,但这没什么区别。

foreach($all_docs as $a) 
    { 
    if(in_array($related_docs, $all_docs)) 
    { 
    print "yes"; 
    } 
    else print "no"; 
    } 

我是否需要在第二个数组中递归搜索?

回答

2

您正在尝试执行递归搜索,其中in_array()无法执行。它只能非常原始地匹配你搜索的数组的第一级。

也许this implementation递归in_array()适用于你所需要的。

另外,使用的东西线沿线的:

function id_exists ($search_array, $id) 
{ 
    foreach ($search_array as $doc) 
    if ($doc["id"] == $id) return true; 

    else return false; 

} 

foreach($all_docs as $a) 
    { 
    if( id_exists($related_docs, $a)) 
    { 
    print "yes"; 
    } 
    else print "no"; 
    } 
+0

感谢您的建议,但递归搜索功能也不起作用。 – stef 2010-03-06 13:59:12

+1

@stef我认为最好的办法是编写一个通过'$ all_docs'循环的自定义函数,并在$ all_docs [i] [“id”] == $ search_id'时返回true。 – 2010-03-06 14:04:34

+0

@stef查看我更新的答案。 – 2010-03-06 14:07:12

1

尝试

$a = array(1); 
$b = array(
    array('id' => 1, 'type_name' => 'bla1'), 
    array('id' => 2, 'type_name' => 'bla2'), 
    array('id' => 3, 'type_name' => 'bla3'), 
); 

察看ID在$ B存在于$一个,所以它的圆比你描述它的其他方式,但结果应该没有关系:

foreach($b as $c) { 
    echo in_array($c['id'], $a) ? 'yes' : 'no'; 
} 

这不是通用的,但它是做你想做的。

+0

而downvote是* what *? – Gordon 2010-03-06 14:14:25

+1

不知道,所以我upvoted你。看起来像是一个干净的解决方案给我。 – 2010-03-06 14:16:46

2
function in_array_multiple(array $needles, array $haystacks) { 
foreach($haystacks as $haystack) { 
    foreach($needles as $needle) { 
     if(in_array($needle, $haystack)) { 
      return true; 
     } 
    } 
} 
return false; 
} 

(这是一个迭代函数,不是递归的。)