【问题标题】:PHP, compare two arrays then create a third array with the resultsPHP,比较两个数组,然后用结果创建第三个数组
【发布时间】:2011-02-01 10:33:57
【问题描述】:

我有一个数组,其中包含基于特定玩家的值,我想使用其中一些值(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($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,事件时间=分钟,得分=积分

我遇到的问题 为了回应 cmets 这是我的问题,以下面的代码为例(它只是一个例子):

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

如果我使用 $entry[2] == $search[2] 之类的比较,它将比较每个 ie 的第二个数组

`[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 分享他的知识

【问题讨论】:

  • 你需要array_walk() 或类似的东西来编写你自己的函数 - php.net/manual/en/function.array-walk.php
  • 我更喜欢遍历数组的自定义过程,而不是遍历。如果输入同时具有数字和字符串索引,则阅读起来不那么深奥,并且可能具有更高的容错性。
  • 这个问题肯定可以通过更改查询来解决,但是您需要为所涉及的表提供确切的数据库结构。

标签: php arrays compare


【解决方案1】:

这个问题很可能可以通过更改查询来解决,但是如果没有确切的数据库结构,很难猜测它可能是什么样子。如果我不能更改查询,我会按照这些思路解决问题。

您希望根据 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);

【讨论】:

  • 你写的东西对我来说很有意义,但如果我使用内置的 Joomla 函数 loadAssocList('key') 我需要更多指导 我可以根据其中一个标准返回,但它不会返回可靠的数据,因为密钥不是唯一的。所以我要离开 Joomla 内置函数,如果我要继续保留上面的查询,我想专注于完全使用 PHP 来实现这个功能,你能告诉我如何返回 $data 和 $search 数组以您上面描述的形式索引,即首先使用 match_id 作为第一个键,分钟作为第二个键。谢谢
  • 我想你误解了我的意思。您可以使用不同的 SQL 查询,您可以转换您已经使用 PHP 查询的数据集。我描述了你可以采取的每个步骤来获得你想要的最终数据集;我只是没有提供 PHP 代码来进行逐步转换。如果给您带来麻烦,我很乐意提供 PHP 代码。
  • 我很欣赏基于我的 PHP 知识进行转换的 PHP 代码。关于 sql 查询,我也愿意在那里提供帮助,但现在我们可以让它们保持原样,如果在您添加 PHP 代码后我仍在努力,我会将所有 sql 背景信息添加到问题的底部.
  • 感谢大家的帮助和耐心,特别感谢 @erisco 分享他的知识
【解决方案2】:
$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);

【讨论】:

  • 感谢您的快速回复我已经修改了我的问题以澄清一点我希望你能给我一些反馈我真的卡住了。
  • @CeltaWeb,上面的技术非常有效,即使您的代码没有开箱即用的细节。您想根据自定义标准构建一组metches。
  • @zanlok 感谢您表现出兴趣我已将我遇到的问题添加到问题的底部,任何反馈将不胜感激
  • 您对通配符有什么想法?没有这样的东西是 php 语言的一部分。相反,您使用循环。我可以发布另一个代码示例,但本质与上面已经演示的 @rik 完全相同。
  • 是的,没有通配符 我对 sql 语法想得太多了。但是,如果您有时间,我知道它会类似于@rik,但请随时给我一个如何比较 $data = array(); 的示例== $搜索 = 数组();使用其子数组中的值。我在上面发布的代码块是数组中的实际 print_r,因此我们将不胜感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多