2016-10-17 4 views
0

私はユーザーの状態に応じてnavメニューを出力するルーチンを作成しようとしています。ユーザーが複数の役割を持つことができること、それは想定され多目的配列要素が配列そのものかどうかを確認してください

array(2) { 
    ["Company 1"]=> 
    array(2) { 
    [0]=> 
    string(3) "dir" 
    [1]=> 
    string(5) "manag" 
    } 
    ["company 2"]=> 
    string(3) "dir" 
} 

:それは次のようになり、ネストされた配列変数(会社=>ロール)を供給する必要があります。

今私のルーチン(簡易版、ちょうど作業ロジックイマイチを表示するために):

function get_menu_1 ($status) { 

     foreach ($status as $company => $position) { 
      $a = is_array($company); //THIS ALWAYS RETURNS FALSE this is for debugging 
      echo "<br>this element is array = $a<br>"; //this is for debugging 
      if (true == is_array($company)) { // THIS ALWAYS RETURNS FALSE this user in this company has multiple roles 

       foreach ($company as $subcompany => $subposition) { 
        echo "<br>$subposition<br>"; 
       } 
      } else { //its not an array, user has one role in the company 

       echo "<br>$position<br>"; 
      } 

     } 

    } 

出力は次のとおりです。is_array()は、変数が配列であるかどうかを確認するために失敗したいくつかの理由

Notice: Array to string conversion in /sata2/home/users/xreact/www/cert.xreact.org/functions.php on line 393 

Array 

this element is array = 

dir 
array(2) { ["Company 1"]=> array(2) { [0]=> string(3) "dir" [1]=> string(5) "manag" } ["Company 2"]=> string(3) "dir" } 

+0

あなたは配列どんなにかのように位置を追加しようとするかもしれません位置は1つだけです。 – xpuc7o

答えて

5

あなたの配列がのキーが配列そのものであるかどうかをテストしていますが、それはできません。

代わりに値をテストする必要があります。サイトノード上

foreach ($status as $company => $position) { 
    echo is_array($company); //will allways be false, because the array key is a string. 
    //in your examples, "Company 1" or "Company 2"; 
    if(is_array($position)) { 
     echo "here you have your nested array"; 
    } 
} 

編集も

、:あなたのデータ構造が少し改善される場合、あなたはalltogetherチェックを回避することができます。 代わりに文字列として1つのロールを保存するのには、1つの文字列要素を持つ配列としてそれを保存することができます - ので、あなたの配列値はオールウェイズ配列は次のとおりです。

$data = array(
    "Company 1"=>array("dir", "manag"), 
    "Company 2"=>array("dir") 
); 
+0

それよりも簡単です:それはできません.... +1 – Poiz

+0

Fielen Dank、しかしそれは動作しません。チェック自体はfalseを返し、内側のforeachに警告がスローされます: 'Invalid argument for foreach()'データ構造の変更に関するあなたの提案に関して、これは間違いなく良い方法ですが、ビットを実装するのは難しいです。 – RWS

+0

それは、foreachにも位置を供給しなければならなかった!ありがとうございました! – RWS

関連する問題