2013-10-14 88 views
0

我有一個XML文件,我讀入PHP數組進行處理,使用CakePHP的XML :: toArray($ xmlString)函數。in_array函數不工作

一切工作正常,我可以輕鬆地處理數據,但是,當我嘗試運行in_array檢查時,即使我知道該值是否存在,它仍會繼續返回false。

這裏的if語句:

$xmlArray = Xml::toArray($xmlString); 
$menus = $xmlArray['navigation']; 
$groupId = array($groupId); // Group ID of logged in user, in my case 1 
$loggedInId = array($loggedInId); // User ID, in my case 182 
//I change them both into arrays, as the second param needs to be an array, and in the XML file, there could only be one value, in which case it's "translated" as a string 
//$submenu == foreach($menu['submenu']['menu'] as $subenu) 
if(in_array($submenu['permission']['group'],$groupId) || in_array($submenu['permission']['user'],$loggedInId)) { 
    //do stuff 
} 

這裏的XML文件(導航比特):

<?xml version="1.0" encoding="utf-8"?> 
<navigation> 
    <menu> 
     <title>Home</title> 
     <url>home</url> 
     <submenus> 
      <menu> 
       <title>In memory of...</title> 
       <url>memoriams</url> 
       <image>memoriam</image> 
       <permission> 
        <group>1</group> 
        <user>0</user> 
       </permission> 
      </menu> 
      <menu> 
       <title>Reports</title> 
       <url>reports</url> 
       <image>report</image> 
       <permission> 
        <group>4</group> 
        <group>5</group> 
        <user>252</user> 
        <user>182</user> 
        <user>234</user> 
       </permission> 
      </menu> 
     </submenus> 
    </menu> 
</navigation> 

菜單僅在第一種情況下顯示出來。這是如果組/用戶只有1個值。如果它有多個值,它只是不顯示子菜單。

這裏是陣列的調試:

array(
    'menu' => array(
     'title' => 'Home', 
     'url' => 'home', 
     'submenus' => array(
      'menu' => array(
       (int) 0 => array(
        'title' => 'In memory of...', 
        'url' => 'memoriams', 
        'image' => 'memoriam', 
        'permission' => array(
         'group' => '1', 
         'user' => '0' 
        ) 
       ), 
       (int) 1 => array(
        'title' => 'Reports', 
        'url' => 'reports', 
        'image' => 'report', 
        'permission' => array(
         'group' => array(
          (int) 0 => '4', 
          (int) 1 => '5' 
         ), 
         'user' => array(
          (int) 0 => '252', 
          (int) 1 => '182', 
          (int) 2 => '234' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

沒有人有任何想法,爲什麼它不想工作?

+1

你剛剛得到的參數以錯誤的方式... – Clive

+0

也看這裏http://php.net/manual/en/function.in-array.php –

回答

2

功能in_array的第一個參數是needle,第二個參數是array來搜索匹配!

參考:PHP Manual

+0

* facepalm *這就是爲什麼當你累了時你不應該編碼... – Albert

1
foreach ($menu['menu']['submenus']['menu'] as $submenu) { 
    $group = $submenu['permission']['group']; 
    $user = $submenu['permission']['user']; 
    if(in_array($group, (array) $groupId) || in_array($user, (array) $loggedInId)) { 
    //do stuff 
    } 
} 
+0

爲什麼'(array)'?這是不需要的,並且可能會因結果而導致非常奇怪的結果。如果要確保它是一個數組,請檢查數組。國際海事組織正確的編碼不需要,只是確保所有的用戶輸入得到正確的處理:) – Martijn

+0

我知道它可能看起來「龐大」,但國際海事組織正確的編碼確實需要。由於第二個參數'in_array()'總是需要是一個數組,因此在變量前面放置'(array)'可以確保如果非數組意外地傳遞給它,它將被轉換成數組,從而防止不必要的錯誤出現在錯誤日誌中,不必要的破壞代碼等。如果傳遞給它的變量已經是一個數組,它將被單獨保留。它沒有任何幫助。但我同意用戶輸入應該正確處理。 ;) – jerdiggity