2017-07-15 7 views
-2

与えられたパラメータを含む配列のすべての項目を数える関数を構築しようとしていますが、関数を呼び出すとき、関数はすべての項目を数えなければなりません。パラメータが配列$paramsに渡されます。これは私がこれまでにやっていることです:PHP:与えられたパラメータと与えられた値を含む多レベル配列のすべての項目を数えます。

function myfunction($params){ 
    global $myArray; 

    if (!isset($params[0])){ $params[0] = ???????? } // I need a wildcard here, so that, if the parameter is not given, the condition will be true by default 
    if (!isset($params[1])){ $params[1] = ???????? } // I need a wildcard here, so that, if the parameter is not given, the condition will be true by default 
    ....etc...... 

    foreach($myArray as $item){ 
    if ($item[0] == $params[0]){ // this condition should be true if parameter is not given 
     if ($item[1] == $params[1]){// this condition should be true if parameter is not given 

      $count += $item 
     } 
    } 
    } 

    return $count; 
} 

私が希望:

myfunction(); //counts everything 
myfunction(array ('0' => 'banana')); //counts only $myArray['0'] = banana 
myfunction(array ('0' => 'apple', '1' => 'eggs')); //counts only $myArray['0'] = apples and $myArray['1'] = eggs 

私はこの方法を確認するために、いくつかの$ paramsは[キー]を持っています。

デフォルト値をparams[key](ワイルドカードのような)に割り当てる必要があるとすれば、指定されていなければ、関数はすべて$ itemを取ります。私は、$item[0]が常に(==)に等しい何かを意味します。ありがとう。 [解答を見る]

+0

もし 'if'と一緒になる' else'についてのべる – alzee

+2

デフォルト値を設定したいのであれば、デフォルト値の配列を作成して、 '$ params'配列に' array_merge() 'を使ってみてください。 – Terry

+0

わからない質問! – Jerald

答えて

2

あなたの関数が宣言されている方法は、にパラメータを渡します。

EDIT

私が正しくあなたのコメントを読めば、$myArrayは次のようになります:何がやりたいことは関数内のコードがそれを検出できるように、デフォルト値を持っています

$myArray=array 
(
    'apple'=>3,  // 3 apples 
    'orange'=>4, // 4 oranges 
    'banana'=>2, // 2 bananas 
    'eggs'=>12,  // 12 eggs 
    'coconut'=>1, // 1 coconut 
); 

何をしたい、それが本当だと仮定すると

です3210
function myfunction($params=NULL) 
{ 
    global $myArray; 
    $count=0; 

    if (empty($params)) // count everything 
    { 
     foreach ($myArray as $num) // keys are ignored 
      $count += $num; 
    } 
    else if (!is_array($params)) // sanity check 
    { 
     // display an error, write to error_log(), etc. as appropriate 
    } 
    else // count what's listed in the $params array 
    { 
     foreach ($params as $key) // check each item listed in $params 
      if (isset($myArray[$key])) // insure request in $myArray 
       $count += $myArray[$key]; // add item's count to total 
    } 

    return $count; 
} 

これは、これはあなたが探している結果ではない場合、あなたはあなたの質問を書き直す必要があるあなたに

myfunction();       // returns 22 
myfunction(array('banana'));   // returns 2 
myfunction(array('apple','eggs'));  // returns 15 
myfunction(array('tomatoes'));   // returns 0 - not in $myArray 

を与えるだろう。

EDIT明示的なキーなしで指定された配列は、要素が記載されているために、数値キー止めされているので、私は上記示した関数呼び出しは、これらとまったく同じであること#2

myfunction();        // returns 22 
myfunction(array(0=>'banana'));   // returns 2 
myfunction(array(0=>'apple',1=>'eggs')); // returns 15 
myfunction(array(0=>'tomatoes'));   // returns 0 - not in $myArray 

ただし、通話はこれらと同等ないます:

myfunction();         // returns 22 
myfunction(array('0'=>'banana'));    // returns 2 
myfunction(array('0'=>'apple','1'=>'eggs')); // returns 15 
myfunction(array('0'=>'tomatoes'));   // returns 0 
この場合

明示ストリングキーアレイに対して指定され、文字列の値は、数値指標として下最も状況を同じを評価する一方、列インデックスはと同じではありません数字のもの。

あなたはあなたの答えで提案されているコードは、いくつかの誤りがあります。常に

foreach($myArray as $item) 
{ 
    foreach ($params as $key => $value) 
    { 
     if (isset($params[$key]) && $params[$key] == $item[$key] ) 
     { 
      $count += $item 
     } 
    } 
} 

まず、isset($params[$key])ますは、自然や配列とforeachによってTRUEに評価されます。

'apple' == 'apple'[0] // testing 'apple' == 'a' 
'apple' == 'orange'[0] // testing 'apple' == 'o' 
'apple' == 'banana'[0] // testing 'apple' == 'b' 
'apple' == 'eggs'[0]  // testing 'apple' == 'e' 
'apple' == 'coconut'[0] // testing 'apple' == 'c' 

あなたが見ることができるように、これは生成されません:私は$key0であるため、これらのテストを行う$params[$key] == $item[$key]になりますmyfunction(array('apple'))を呼び出して、上に示したように、第2、なぜならあなたの外側のforeachループで、あなたの$myArray場合は構成されています予想された結果。

コードの3番目の問題は、$count += $item行の最後にセミコロンがないことです。答えとして提案する前にこのコードを実行しようとしなかったと思います。

EDIT#3

あなたの元の質問がひどく明確ではないので、多分あなたが何をしようとしていること$myArrayタイプのもののの数を数えるのではなくであることを私に起こりました要求された各カテゴリのアイテムの合計数を取得します。その場合には、myfunction()の最後の分岐がさらに簡単である:これらの結果のどちらがあなたに何をしている場合

else // count what's listed in the $params array 
    { 
     foreach ($params as $key) // check each item listed in $params 
      if (isset($myArray[$key])) // insure request in $myArray 
       $count++; // add the item to the total 
    } 

サンプル私が示され$myArrayでは、上記の変更は、再びあなたに

myfunction();       // returns 5 
myfunction(array('banana'));   // returns 1 
myfunction(array('apple','eggs'));  // returns 2 
myfunction(array('tomatoes'));   // returns 0 - not in $myArray 

を与えますあなたの質問を書き直す必要があります。は、$myArrayのサンプルを含みます。 @FKEinternet解答後

+0

ありがとうFKE。私のために働く解決策が出てきました。私はあなたのことが好きですが、私の場合のようにif-elseを入れ子にしたときにelseステートメントをどのように数えるかはわかりません。あなたのソリューションにそれを表示してください。 – codeispoetry

+0

$ myArrayの外観はどうですか?ネストされたif-elseは本当に必要ですか? – FKEinternet

+0

ところで、答えを更新するように頼んだら、それを見ずに去って行くことは無意味だと思うかもしれません - 何を見ていないなら、私の答えを肉体的にする*そうだった? – FKEinternet

-1

MY SOLUTION

(広範囲にテスト、これまでのところ作品はありません)

が、これは私のために機能するソリューションです:明らかに$ paramsはは、同じキーを使用する必要があります$ item。以下のためので、foreachの反復パラメータ[「にmykeyは」] [「にmykey」]関数を呼び出すときに与えられ、その値が項目に等しいされている場合、カウントは1

function myfunction($params=NULL){ 
    global $myArray; 

    foreach($myArray as $item){ 
    foreach ($params as $key => $value){ 
      if (isset($params[$key]) && $params[$key] == $item[$key] ){ 
      $count += $item; 
     } 
    } 
    } 

    return $count; 
} 

の成長の繰り返しと$を数えるおかげでみんなすべての入力!!

+0

このコード(あなたがしたとは思わない理由については、私の編集#2を参照してください)あなたの '$ myArray'が*図示されていない限り、私のコードを実際に使ってみてくださいあなたの '$ myArray'が*そのように構造化されていなければ*あなたの質問を編集して*正しい* $ myArray構造のイラストを*含むようにします。 – FKEinternet

関連する問題