2013-10-14 60 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