簡體   English   中英

PHP,比較兩個數組,然后使用結果創建第三個數組

[英]PHP, compare two arrays then create a third array with the results

我有一個數組,該數組具有基於特定玩家的值,我想使用其中一些值(match_id和分鍾數)與第二個數組進行比較,然后創建第三個數組來保存返回的值。

我正在為基於Joomla的網站編寫此代碼,因此我在使用內置數組函數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();

$ search數組以以下格式輸出一個數組。 的print_r($搜索);

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 ) 
        )

第二個數組包含數百個記錄,它們的布局與第一個相同。

$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();

$ data數組的輸出格式與上述相同。 的print_r($數據);

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 

最后,我需要用僅基於match_id和minutes的$ search和$ data數組之間的匹配記錄來填充第三個數組。

    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

我已經修改了原始問題,以包含更多信息,但我不是專家,所以我正在尋找所有想法和反饋。 謝謝

注意:列名稱區域如下:名稱=名,比賽ID =比賽ID,比賽名稱= m_name,比賽時間=分鍾,得分=積分

我遇到的問題為了回應評論,這是我的問題,以以下代碼為例(僅作為示例):

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

如果我使用$ entry [2] == $ search [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分享他的知識

可以通過更改查詢來解決此問題,但是由於沒有確切的數據庫結構,因此很難猜測其外觀。 如果我無法更改查詢,則可以按照以下方式解決問題。

您要根據match_id和分鍾進行匹配,因此最好將它們作為索引。

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("Marco", "Xornada 04", 3)
    ),
    129 => array(
        1 => array("Marco", "Xornada 08", 2)
        6 => array("Marco", "Xornada 08", 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 / minutes索引,則取決於您。)

現在,您可以將該數組簡化為所需的形式。

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);
$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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM