PHP, сравните два массива, затем создайте третий массив с результатами

У меня есть массив со значениями, основанными на конкретном игроке, и я хочу использовать некоторые из этих значений (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 

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

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

Примечание. Области имен столбцов следующие: Имя = имя_имя, идентификатор матча = идентификатор_матча, имя матча = m_имя, время события = минуты, а набранные очки = очки.

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

$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 за то, что поделился своими знаниями


person CoalaWeb    schedule 01.02.2011    source источник
comment
Вам понадобится array_walk() или что-то подобное для написания собственной функции - php.net/manual/ ru/function.array-walk.php   -  person Jake N    schedule 01.02.2011
comment
Я бы предпочел пользовательский процесс, который перебирает массив, а не прогулку. Менее эзотерический для чтения и, возможно, более отказоустойчивый, если входные данные имеют как числовые, так и строковые индексы.   -  person zanlok    schedule 02.02.2011
comment
Эту проблему определенно можно решить, изменив запрос, но вам нужно будет предоставить точную структуру базы данных для задействованных таблиц.   -  person erisco    schedule 02.02.2011


Ответы (2)


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

Вы хотите сопоставлять на основе 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);
person erisco    schedule 02.02.2011
comment
То, что вы написали, имеет для меня смысл, но мне нужно немного больше указаний, если я использую встроенную функцию Joomla loadAssocList('key'). Я могу возвращать базы по одному из критериев, но он не возвращает надежные данные из-за того, что ключи не уникальный. Итак, я оставляю встроенную функцию Joomla и хочу сосредоточиться на том, чтобы заставить ее работать исключительно с PHP, если бы я продолжал оставлять приведенные выше запросы такими, какие они есть, не могли бы вы показать мне, как я буду возвращать массивы $data и $search индексируется в форме, которую вы описали выше, т.е. сначала с использованием match_id в качестве первого ключа и минут в качестве второго. Спасибо - person CoalaWeb; 03.02.2011
comment
Я думаю, вы неправильно поняли, что я сказал. Вы можете использовать другой SQL-запрос или преобразовать уже запрошенные наборы данных для использования PHP. Я описал каждый шаг, который вы можете предпринять, чтобы получить окончательный набор данных, который вам нужен; Я просто не предоставлял PHP-код для выполнения пошаговых преобразований. Я был бы рад предоставить код PHP, если он доставляет вам проблемы. - person erisco; 03.02.2011
comment
Я ценю код PHP для выполнения преобразований, которые основаны на моих знаниях PHP. Что касается sql-запросов, я тоже готов помочь, но пока мы можем оставить их как есть, если после добавления вашего PHP-кода я все еще борюсь, я добавлю всю справочную информацию о sql в конец вопроса . - person CoalaWeb; 04.02.2011
comment
Спасибо всем за помощь и терпение и особенно @erisco за то, что поделился своими знаниями - person CoalaWeb; 05.02.2011

person    schedule
comment
Спасибо за быстрый ответ. Я пересмотрел свой вопрос, чтобы немного уточнить. Надеюсь, вы дадите мне отзыв. Я действительно застрял. - person CoalaWeb; 02.02.2011
comment
@CeltaWeb, описанная выше техника вполне действительна, даже если особенности вашего кода не работают из коробки. Вы хотите создать массив метчей на основе настраиваемых критериев. - person zanlok; 02.02.2011
comment
@zanlok спасибо за проявленный интерес, я добавил проблему, с которой столкнулся, в конец вопроса, буду признателен за любую обратную связь. - person CoalaWeb; 02.02.2011
comment
ваша идея о подстановочных знаках? ничего подобного не является частью языка php. вместо этого вы используете циклы. Я мог бы выложить еще один пример кода, но суть была бы именно такой, как уже продемонстрировал @rik выше. - person zanlok; 02.02.2011
comment
Да, никаких подстановочных знаков, я слишком много думал о синтаксисе sql. Но если у вас есть время, я знаю, что это будет похоже на @rik, но не стесняйтесь привести мне пример того, как сравнивать $data = array(); == $поиск = массив(); используя значения в своих подмассивах. Фрагменты кода, которые я разместил выше, являются фактическими print_r из массивов, поэтому любая помощь будет оценена по достоинству. - person CoalaWeb; 02.02.2011