2016-12-14 7 views
1

私はPHPにはとても新しいので、簡単に私に行ってください。この問題は数時間前から私には夢中になっていたので、私は自分の誇りを呑み込んで、なぜこれが問題になるのか理解できることを望んでいると思った。PHP in_array()誤った結果を返す

私は次のコードでオブジェクト配列から変換された配列を有する:

$category_tree = $client->catalogCategoryTree($session_id); // Get an object array of all categories and assign to $category_tree. 
$category_list = (array) $category_tree; // Convert $category_tree into an array and assign to $category_list. 

この出力print_r($category_list)を使用する場合は、以下のように:

Array 
(
    [category_id] => 1 
    [parent_id] => 0 
    [name] => Root Catalog 
    [position] => 0 
    [level] => 0 
    [children] => Array 
     (
      [0] => stdClass Object 
       (
        [category_id] => 2 
        [parent_id] => 1 
        [name] => Root Category 
        [is_active] => 1 
        [position] => 1 
        [level] => 1 
        [children] => Array 
         (
          [0] => stdClass Object 
           (
            [category_id] => 8 
            [parent_id] => 2 
            [name] => Designer 
            [is_active] => 1 
            [position] => 1 
            [level] => 2 
            [children] => Array 
             (
             ) 

           ) 

          [1] => stdClass Object 
           (
            [category_id] => 7 
            [parent_id] => 2 
            [name] => Shop Bags 
            [is_active] => 1 
            [position] => 2 
            [level] => 2 
            [children] => Array 
             (
             ) 

           ) 

          [2] => stdClass Object 
           (
            [category_id] => 5 
            [parent_id] => 2 
            [name] => DifferentCategory 
            [is_active] => 1 
            [position] => 3 
            [level] => 2 
            [children] => Array 
             (
              [0] => stdClass Object 
               (
                [category_id] => 6 
                [parent_id] => 5 
                [name] => 1 
                [is_active] => 1 
                [position] => 1 
                [level] => 3 
                [children] => Array 
                 (
                 ) 

               ) 

             ) 

           ) 

          [3] => stdClass Object 
           (
            [category_id] => 4 
            [parent_id] => 2 
            [name] => Sample Category 
            [is_active] => 1 
            [position] => 6 
            [level] => 2 
            [children] => Array 
             (
             ) 

           ) 

         ) 

       ) 

     ) 

) 

Iは、IFのためにテストしてい文字列がin_array()を使用してこの配列内に存在する場合、その結果は、実行していないにもかかわらず、文字列内に存在することを示しています。

$string = 'Chanel'; 
if (in_array($string, $category_list)) { 
    echo 'The string is in the array'; 
} else { 
    echo 'The string is not in the array'; 
} 

この出力:このために以下のコードを参照してください

The string is in the array

をしかし、(上記のアレー出力から見ることができるように)そうではありません。

は、あなたがこの新しい男を提供することができます任意の洞察力のために事前にありがとう:)

+1

==現在、 ' '文字列、厳密な型の比較http://nl1.php.net/in_arrayを使用して0'' – Kisaragi

答えて

1

私が起こっているいくつかの型の強制があったと思います。 PHPが文字列Chanelを整数と比較する必要がある場合、結果に到達するために型変換を行います。むしろこれが起こらないように思われます。幸い、in_array()の3番目のオプションの引数があります。この引数は、型が値と一致する必要があるかどうかを制御します。

変更してみてください:

if (in_array($string, $category_list)) { 

if (in_array($string, $category_list, true)) { 
+0

今これを試してみてください'$ string'が配列に含まれていないが、肯定的な結果をテストした後で、' $ string'の値を配列出力の最上位レベルに存在する 'ルートカタログ 'に変更すると動作するようです私のポストから。私はさらにネストされた 'Designer'を使ってテストし、配列内に存在しないと言われました。ここで入れ子配列にアクセスできない可能性はありますか?初期のオブジェクト配列を変換する別の方法、またはこれを回避する別の方法を探すべきでしょうか?ありがとうございました。 –

+0

それらの 'stdClass Objects'とは何か関係がありますか?おそらく配列に2回変換する必要がありますか? –

+2

['in_array()'](http://php.net/manual/en/function.in-array.php)は入れ子配列に再帰しません。あなた自身でそれを行う再帰関数を書いてください。 – Asaph

関連する問題