2016-08-29 16 views
0

私は、キーと値を持つ配列で単語 "オンライン"を数えようとしています。 $aをエコーphp関数が予期せぬ出力を出す

function p($a){ 
    function printAllVals($a, $val) { 
     if (!is_array($a)) { 
     if ($a == "online"){ 
      $val+=1; 
      echo $val; 
      //echo $a <-- this prints online 5 times 
     } 
      return; 
     } 
     foreach($a as $k => $v) { 
      printAllVals($v, $val); 
     } 
    } 
    printAllVals($a, 0); 
} 

それが印刷さ "オンライン" 5回が、$ valの版画 "1" 5回。 関数が呼び出されたときの元の値が$valのようです。私は何を間違えたのですか?

$ aが配列であり、それは(多次元)は、次のようなものだ:不完全な質問申し訳ありません

prod: 
     cluster: 
      csddb: 
       inst_1: online 
       inst_2: online 
      oiddb: 
       inst1: online 
       inst2: offline 
     local: 
      quoid: 
       inst_1: offline 
       inst_2: offline 
      qaprod: 
       inst_1: offline 
       inst_2: offline 

+1

テスト対象の入力データは何ですか? –

+0

@dragosteそれは次のようなものですが、もっと長いものです。 PROD: クラスター: csddb: inst_1:オンライン inst_2:オンライン oiddb: INST1:オンライン INST2:オフライン ローカル: quoid: inst_1:オフライン inst_2:オフライン qaprod: inst_1:オフライン inst_2:オフライン – TAS

+1

あなたの投稿で適切な形式で更新してください。 –

答えて

0

これは再帰です。したがって、以前の状態に戻って再帰すると、以前の値に戻って、$valの状態が緩くなります。 $valを返す必要があります。

function printAllVals($a, $val) { 
     if (!is_array($a)) { 
     if ($a == "online"){ 
      $val+=1; 
      echo $val; 
//   echo $a; 
     } 
      return $val; 
     } 
     foreach($a as $k => $v) { 
      $val = printAllVals($v, $val); 
     } 
     return $val; 
    } 
    printAllVals($a, 0); 
関連する問題