PHP, сравните два массива, затем создайте третий массив с результатами - PullRequest
1 голос
/ 01 февраля 2011

У меня есть массив со значениями, основанными на конкретном проигрывателе, и я хочу использовать некоторые из этих значений (match_id и minutes) для сравнения со вторым массивом, а затем создать третий массив для хранения возвращаемых значений.

Я пишу это для веб-сайта на основе Joomla, поэтому я использую встроенный массив functions 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 ($ 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 ) 
        )

Второй массив содержит сотни записей с такой же компоновкой, что и первая.

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

И, наконец, мне нужно заполнить третий массив записями, которые совпадают между массивами $ search и $ data, основываясь только на 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

Я изменил свой первоначальный вопрос, чтобы включить в него дополнительную информацию. Я не эксперт, поэтому я ищу все и любые идеи и отзывы.Спасибо

Примечание: Области имен столбцов следуют за Name = first_name, Match ID = match_id, Match name = m_name, Время события = минуты и набранные очки = очки

Проблемы IУ меня В ответ на комментарии это моя проблема, возьмите следующий код для примера (это только пример):

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

Если я использую сравнение как $ entry [2] == $search [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 за то, что он поделился своими знаниями

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

Эта проблема, вероятно, может быть решена путем изменения запроса, но без точной структуры базы данных трудно предположить, как это может выглядеть.Если бы я не мог изменить запрос, я бы решил проблему следующим образом.

Вы хотите сопоставить на основе 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);
0 голосов
/ 01 февраля 2011
$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...