2011-02-01 10 views
1

特定のプレーヤに基づいた値を持つ配列があります。これらの値の一部(match_idとminutes)を使用して2番目の配列と比較し、戻り値を保持する3番目の配列PHP、2つの配列を比較して結果のある3番目の配列を作成

私はこれをJoomlaベースのWebサイト用に書いていますので、inbuilt配列関数LoadRowList()を使用しています。クエリによって返されたテーブルレコードからインデックス付き配列のインデックス付き配列を返します。

最初の配列は、特定のプレイヤー

$search = array(); 
       $query = "SELECT first_name,match_id,m_name,minutes,points 
          FROM #__bl_players as pl,#__bl_match_events as me,#__bl_matchday as md, #__bl_match as m 
          WHERE pl.id = me.player_id 
          AND pl.id = ".$player_id." 
          AND me.match_id = m.id 
          AND m.m_id = md.id 
          "; 
     $db->setQuery($query); 
     $search = $db->loadRowList(); 

$検索配列は、以下の形式の配列を出力に基づいて移入値を含みます。 print_r($ search);

Array ( 
     [0] => Array ([0] => Marco [1] => 33 [2] => Xornada 04 [3] => 7 [4] => 3) 
     [1] => Array ([0] => Marco [1] => 129 [2] => Xornada 08 [3] => 1 [4] => 2) 
     [2] => Array ([0] => Marco [1] => 129 [2] => Xornada 08 [3] => 6 [4] => 2) 
     ) 

第2の配列には、最初の配列と同じレイアウトの数百​​のレコードが含まれています。

$data = array(); 
       $query = "SELECT first_name,match_id, m_name,minutes,ecount 
       FROM #__bl_players as pl,#__bl_match_events as me,#__bl_matchday as md, #__bl_match as m 
       WHERE pl.id = me.player_id 
       AND me.match_id = m.id 
       AND m.m_id = md.id 
       AND md.s_id = ".$s_id." 
         "; 
     $db->setQuery($query); 
     $data = $db->loadRowList(); 

$データ配列は、上記と同じ形式で出力されます。 print_r($ data);

Array ( 
     [0] => Array ([0] => Pablo [1] => 8 [2] => Xornada 01 [3] => 2 [4] => 3) 
     [1] => Array ([0] => Juan Ramón [1] => 9 [2] => Xornada 01 [3] => 1 [4] => 0) 
     [2] => Array ([0] => Pedro [1] => 9 [2] => Xornada 01 [3] => 1 [4] => 3) 
)etc etc etc 

そして最後に、私は3番目の配列のみmatch_idと分に基づいて$検索と$データ配列との間の一致のレコードによって移入する必要があります。

Array(
    [0]=>Array ([1]=> PlayerName(from the first array)[2]=> MatchID[3]=> MatchName[4]=> TimePlayed[5]=> Score(from the first array)[6]=> Score(from the second array)[7]=> PlayerName(from the second array)) 
)etc etc etc 

私は私がすべてと任意のアイデアやフィードバックを探していますので、私は専門家だより多くの情報を含めるように、私の元の質問を修正しました。おかげ

注:列名の領域Iは、In を抱えている名前= FIRST_NAME、マッチID = match_id、マッチ名= M_NAME、イベント時間=分、ポイント獲得=ポイント

の問題を次のコメントへの応答は、これが私の問題は、例えば、次のコード(その唯一の例)を取るです:私は$エントリのような比較を使用する場合は

$matches = array(); 
foreach ($data as $entry){ 
    if ($entry[2] == $search[2]) { 
match =$search; 
$matches[] = $match 
    } 
} 
print_r($mtaches) 

を[2] == $ [2]それが比較されますを検索それぞれから2番目の配列

`[2] => Array ([0] => Marco [1] => 129 [2] => Xornada 08 [3] => 6 [4] => 2) 

==

[2] => Array ([0] => Pedro [1] => 9 [2] => Xornada 01 [3] => 1 [4] => 3)` 

ので、私の質問は、私は、キーの値が彼らの助けと忍耐のために皆に

$entry[*][2] == $search[*][2] 

おかげで、すなわち比較できるようにワイルドカードの種類を使用しない方法です特に自分の知識を共有するための@eriscoへ

+1

あなたは 'あるarray_walk()'したり、独自の関数を記述に似必要になります - http://php.net/manual/en/function.array-walk.php –

+0

を私はそのカスタムプロセスを好みます歩行とは対照的に、配列を反復する。入力に数値と文字列の両方が含まれている場合は、読みにくく、フォールトトレラントである可能性があります。 – zanlok

+0

この問題は、問合せの変更ではっきりと解決できますが、関連する表に対して正確なデータベース構造を提供する必要があります。 – erisco

答えて

4

この問題は、クエリの変更によって解決される可能性がありますが、正確なデータベース構造がない場合は、どのように見えるかを推測することは困難です。クエリを変更できない場合は、これらの行に沿って問題を解決します。

match_idと分に基づいて一致させたいので、それらをインデックスとして持つのが理想的です。同じことが同様に二番目の配列に適用される

array(
    33 => array(
     7 => array("Marco", "Xornada 04", 3) 
    ), 
    129 => array(
     1 => array("Marco", "Xornada 08", 2) 
     6 => array("Marco", "Xornada 08", 2) 
    ) 
) 

:へ

Array ( 
     [0] => Array ([0] => Marco [1] => 33 [2] => Xornada 04 [3] => 7 [4] => 3) 
     [1] => Array ([0] => Marco [1] => 129 [2] => Xornada 08 [3] => 1 [4] => 2) 
     [2] => Array ([0] => Marco [1] => 129 [2] => Xornada 08 [3] => 6 [4] => 2) 
     ) 

変更。次に、キーに基づいてそれらを一緒にマージすることができます。あなたの二番目の配列はこのように見えた場合:

array(
    33 => array(
     7 => array("Pablo", "Xornada 04", 3) 
    ) 
) 

を次にマージされたバージョンは、次のようになります。

array(
    33 => array(
     7 => array(
      array("Marco", "Xornada 04", 3), 
      array("Pablo", "Xornada 04", 3) 
     ) 
    ) 
) 

(あなたは合併の時に非マッチを捨てるかどうか、あなたは、単にmatch_idを除外した場合/後で少なくとも2人のプレイヤーがいない分のインデックスはあなた次第です)

これで、この配列を目的の形式に縮小することができます。

array(
    array("Marco", 33, "Xornada 04", 7, 3, 3, "Pablo") 
) 

これは、変換がどのように起こるかの例です。

<?php 

$one = array( 
    array("Marco", 33, "Xornada 04", 7, 3), 
    array("Marco", 129, "Xornada 08", 1, 2), 
    array("Marco", 129, "Xornada 08", 6, 2) 
); 

$two = array(
    array("Pablo", 33, "Xornada 04", 7, 1), 
    array("Pedro", 129, "Xornada 08", 1, 0), 
    array("Garcia", 45, "Xornada 01", 2, 2) 
); 

$three = array(); 
foreach ($one as $o) { 
    $three[$o[1]][$o[3]][] = array($o[0], $o[2], $o[4]); 
} 

foreach ($two as $t) { 
    if (isset($three[$t[1]][$t[3]])) { 
     $three[$t[1]][$t[3]][] = array($t[0], $t[2], $t[4]); 
    } 
} 

$four = array(); 
foreach ($three as $matchId => $t) { 
    foreach ($t as $minutes => $tt) { 
     // filter out non-matches 
     if (count($tt) > 1) { 
      $p1 = $tt[0]; 
      $p2 = $tt[1]; 
      $four[] = array($p1[0], $matchId, $p1[1], $minutes, $p1[2], $p2[2], $p2[0]); 
     } 
    } 
} 

print_r($four); 
+0

あなたが書いたことは私には意味がありますが、Joomlaの組み込み関数loadAssocList( 'key')を使用すると、基準の1つに基づいていますが、キーが一意でないため信頼できるデータを返しません。だから、私はJoomlaの関数を組み込んでおきます。PHPを使ってこの関数を使うことに集中したいのですが、$ dataと$ search配列を返す方法を教えてください。最初にmatch_idを最初のキーとして使用し、分を2番目のキーとして使用します。ありがとう – CoalaWeb

+0

私はあなたが私が言っていたことを誤解していると思います。別のSQLクエリを使用することができます。*または* PHPを使用して既にクエリされたデータセットを変換することができます。私は、あなたが望む最終的なデータセットに到達するために取ることができる各ステップについて説明しました。私は、ステップバイステップの変換を行うためのPHPコードを提供していませんでした。 PHPコードを提供することができれば幸いです。 – erisco

+0

これは私のPHP知識の上に構築している変換を行うPHPコードに感謝します。 SQLクエリに関しては、私もそこで手伝っていますが、今のところPHPコードを追加した後でも私はまだ戦っていますが、質問の下にすべてのSQLバックグラウンド情報を追加します。 – CoalaWeb

-1
$search = array(
    1 => 'PlayerName', 
    2 => 'MatchID', 
    3 => 'MatchName', 
    4 => 'TimePlayed', 
    5 => 'Score', 
); 

$data = array(
    array(
     // match 
     1 => 'PlayerName', 
     2 => 'MatchID', 
     3 => 'MatchName', 
     4 => 'TimePlayed', 
     5 => 'Score', 
    ), 
    array(
     // match 
     1 => 'OtherPlayerName', 
     2 => 'MatchID', 
     3 => 'OtherMatchName', 
     4 => 'TimePlayed', 
     5 => 'OtherScore', 
    ), 
    array(
     // no match 
     1 => 'OtherPlayerName', 
     2 => 'OtherMatchID', 
     3 => 'OtherMatchName', 
     4 => 'OtherTimePlayed', 
     5 => 'OtherScore', 
    ), 
); 

$matches = array(); 
foreach ($data as $entry) { 
    if ($entry[2] == $search[2] && $entry[4] == $search[4]) { 
     $match = $search; 
     $match[6] = $entry[5]; 
     $match[7] = $entry[1]; 
     $matches[] = $match; 
    } 
} 

print_r($matches); 
+0

お返事ありがとうございます私は少し明確にするために私の質問を改訂しました私はあなたに私が本当に立ち往生しているいくつかのフィードバックを与えることを願っています。 – CoalaWeb

+0

@CeltaWeb上記の手法は、あなたのコードに対して仕様が実行されなかったとしても、非常に有効です。カスタム条件に基づいて一連のメタデータを作成する必要があります。 – zanlok

+0

@zanlok興味を表明してくれてありがとう私は問題を追加しました私は質問の一番下にあるすべてのフィードバックをいただければ幸いです – CoalaWeb

関連する問題