2014-08-29 114 views
0

我從xml的webservice轉換了這個數組。我在這個數組中有500個項目。 我想搜索任何值並返回所有找到的具有密鑰關聯的數組項(類似於數據庫選擇查詢)。所以如果我搜索'dummy',那麼它應該返回這個數組的第一個項目。在多維數組中搜索值並保持鍵的關聯

 
Array 
(
    [12.12.2014] => Array 
     (
      [7] => Array 
       (
        [id] => 1672 
        [date] => 12.12.2014 
        [description] => rummy dummy data 
        [room] => delux 
        [Type] => garden 
        [from] => 17:00 
        [to] => 17:45 
        [assets] => Array 
         (

       [asset] => Array 
           (
            [0] => Array 
             (
              [number] => 5275 
              [detail] => primary one 
             ) 

        [1] => Array 
             (
              [number] => 19 
              [detail] => secondary one 
             ) 

           ) 

         ) 

        [references] => Array 
         (
          [reference] => Array 
           (
            [personnumber] => 479470 
            [type] => worker 
            [name] => David 
            [department] => Sales 
            [cv] => Array 
             (
        [pdetails] => follow later 
             ) 

            [profile] => True 
           ) 

         ) 

       ) 

     ) 

     [13.12.2014] => Array 
     (
      [17] => Array 
       (
        [id] => 1672 
        [date] => 13.12.2014 
        [description] => brown fox jump 
        [room] => star 
        [Type] => city 
        [from] => 17:00 
        [to] => 17:45 
        [assets] => Array 
         (
          [asset] => Array 
           (
            [number] => 5275 
            [detail] => prime two 
           ) 

         ) 

        [references] => Array 
         (
          [reference] => Array 
           (
            [personnumber] => 479470 
            [type] => manager 
            [name] => Albert 
            [department] => Purchase 
            [cv] => Array 
             (
        [pdetails] => follow later 
             ) 

            [profile] => True 
           ) 

         ) 

       ) 

     ) 

) 

我試圖stripos搜索字符串中數組值和基於in_array功能,但是它要麼會產生不正確的結果或鍵關聯沒有被維持。

我無法找到維護鍵值的方法。

 
function search($array, $key, $value) 
{ 
    $results = array(); 

    if (is_array($array)) 
    { 
     if (isset($array[$key]) && $array[$key] == $value) 
      $results[] = $array; 

     foreach ($array as $subarray) 
      $results = array_merge($results, search($subarray, $key, $value)); 
    } 

    return $results; 
} 

這可能是你見過的最糟糕的功能,但這可以完成這項工作。如果有人能夠遞歸(數組可能會更深)。

 
function search_in_multi_array($srchvalue, $array) 
    { 
     $foundkey = ''; 
     if (is_array($array) && count($array) > 0) 
      { 
      foreach($array as $pkey => $pvalue) 
       { 
       foreach($pvalue as $ckey => $cvalue) 
        { 
        if (is_array($cvalue) && count($cvalue) > 0) 
         { 
         if(in_array($srchvalue,$cvalue)) 
          { 
          $foundkey[$pkey][$ckey] = $cvalue; 
          } 
          foreach($cvalue as $dkey => $dvalue) 
           { 
           if(!is_array($dvalue)) 
            { 
            $pos = stripos($dvalue, $srchvalue); 
            if ($pos !== false) 
             { 
             $foundkey[$pkey][$ckey] = $cvalue; 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     return $foundkey; 
    } 

函數調用 - $針= '狐狸'; search_in_multi_array($ needle,$ my_array); 這是輸出

 
Array 
(
    [13.12.2014] => Array 
     (
      [17] => Array 
       (
        [id] => 1672 
        [date] => 13.12.2014 
        [description] => brown fox jump 
        [room] => star 
        [Type1] => city 
        [from] => 17:00 
        [to] => 17:45 
        [assets] => Array 
         (
          [asset] => Array 
           (
            [number] => 5275 
            [detail] => prime two 
           ) 

         ) 

        [references] => Array 
         (
          [reference] => Array 
           (
            [personnumber] => 479470 
            [Type1] => manager 
            [name] => Albert 
            [department] => Purchase 
            [cv] => Array 
             (
              [pdetails] => follow later 
             ) 

            [profile] => 1 
           ) 

         ) 

       ) 

     ) 

) 
+0

你必須顯示你已經嘗試過 – hindmost 2014-08-29 09:52:57

+0

給定數組的期望輸出是什麼。舉一些例子 – 2014-08-29 09:55:21

+0

看看這裏:http://stackoverflow.com/questions/6661530/php-multi-dimensional-array-search – 2014-08-29 09:56:54

回答

0

你可能想看看XPath反對「原始」 XML運行查詢,看到DOMXPath例如。

喜歡的東西/myRootTag/someDayTag[.//text()[contains(.,'MY_SEARCH_VALUE')]]應該做的伎倆,選擇並返回所有這些在任何子節點文本MY_SEARCH_VALUEmyRootTagsomeDayTag XML元素。

+0

沒有XML功能沒有解決方案嗎? – atyagi 2014-08-29 10:06:17

+0

我確定還有其他的解決方案,但是如果您只需要從XML文檔中提取特定的值/子結構,那麼使用單個XPath查詢而不是幾十行代碼來轉換XML應該更加簡單和簡潔到數組並手動搜索樹。 – JimmyB 2014-08-29 10:08:58

0

您可以使用array_search()函數查看數組值。但array_search只能在一維數組中查找。

既然你有一個多維數組,你可以編寫自定義的遞歸函數數組

function recursive_array_search($needle,$haystack) { 
foreach($haystack as $key=>$value) { 
    $current_key=$key; 
    if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) { 
     return $current_key; 
    } 
} 
return false; 
} 

但請注意,遞歸搜索,使用array_search()是一個更簡單的方法,但不是最優化的功能。這意味着如果你更關心你的內存利用率,那麼我還會提出一些建議。

  • 創建一個新的陣列說「字典」,並將它們存儲像 $dictonary[<key-searched>] = array('12.12.2014', '13.12.2014')
  • 所以你處理它們一次,當你想爲同一個鍵再次搜索
  • 因此,下一次緩存它們,你可以首先檢查密鑰是否存在於字典中。如果存在則返回,否則使用array_search並將結果緩存在字典中

它通過鍵值進行搜索總是比在多維數組中搜索更容易。

+0

謝謝你的努力。但是這個功能只給出了最高級別的關鍵,所以如果我搜索'花園',我只能得到12.12.2014 – atyagi 2014-08-29 10:36:13

+0

但是這不正是你所要求的嗎? 「所以如果我搜索'dummy',那麼它應該返回這個數組的第一個項目。」 - 請求的「這個數組的第一項」就是'$ myArray ['12.12.2014']',不是嗎? – JimmyB 2014-09-02 08:41:09

0

我做了一個簡單的步驟,將提取數組中,你要尋找的值:

function search_keys($needle,$haystack) 
{ 
    foreach($haystack as $key => $value) 
    { 
    if (is_array($value)) $output[$key] = search_keys($needle,$value); 
    else if (strpos($value,$needle) !== FALSE) $output[$key] = $value; 
    } 
    return isset($output) ? $output : NULL; // prevent warning 
} 

echo '<pre>'; 
print_r(search_keys('garden',$data)); 
echo '</pre>'; 

這將返回「花園」爲:

Array 
(
    [12.12.2014] => Array 
     (
      [7] => Array 
       (
        [Type] => garden 
       ) 

     ) 

) 

您可以進一步處理該功能的輸出,或根據需要更改功能。