[英]Compare two associative arrays and create a new array with the matched arrays, 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.