2010-03-06 122 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; 
} 

(這是一個迭代函數,不是遞歸的。)