【问题标题】:PHP Looping an array and running a function on a array itemPHP循环数组并在数组项上运行函数
【发布时间】:2016-12-29 14:18:43
【问题描述】:

我似乎遇到过几次这个问题并弄清楚了,但是下次遇到它时我就无法弄清楚了。

所以我有一个 SQL 语句,它照常返回 $result 变量...

$result = $stmt->fetchAll( PDO::FETCH_ASSOC );

我会在下面向你展示一个瘦身的回报

数组
(
    [开斋节] => 1
    [eTitle] => 超级联赛
    [eDesc] =>
    [cid] => 1
    [删除] => 0
    [eStartTime] => 15:00
    [eHome] => 1
    [轻松] => 2
    [eKickoff] => 15:00:00
    [日期] => 2016-08-20
)
大批
(
    [开斋节] => 2
    [eTitle] => 足总杯
    [eDesc] =>
    [cid] => 1
    [删除] => 0
    [eStartTime] => 15:00
    [eHome] => 1
    [轻松] => 2
    [eKickoff] => 15:00:00
    [日期] => 2016-08-27
)

现在我要做的是遍历 $result 并在每个键 eHome 和 eAway 上运行下面的函数是我正在尝试做的伪代码。

loop ( $reult ) 

$row[eHome][eHomeData] = $this->getTeam( $row['eHome'] )
$row[eHome][eAwayData] = $this->getTeam( $row['eAway'] )

所以基本上我想用主队或客队数据重建数组,这些数据使用 eHome 和 eAway 中给出的 id。

我应该这样做还是应该在 MySQL 中使用 JOINS?

对不起,如果我措辞不好,我已经为此苦苦挣扎了几个小时并放弃了。

提前谢谢各位。

汤姆

【问题讨论】:

  • 如果$this->getTeam 是另一个查询,那么您可能应该使用连接。循环中的查询或基于另一个查询结果的查询几乎总是意味着您的数据库\代码结构不佳。但根据提供的信息,这确实无法回答
  • 所以您还想在之后删除 eAway 键?
  • 我认为没有足够的信息来说明您最初从哪里获得的数据以及所需的输出是什么(以及为什么)。结果数据集与您已经获得的数据集没有太大区别......它只是合并到一个子数组中。
  • 如果我尝试提前考虑:我假设getTeam(id) 提供了该特定团队的所有数据。所以我会运行一个查询来获取第一个查询('....where team_id in(1,2,3,4,)')中涉及的所有团队数据,并将其存储到一个以 id 为键的数组中。
  • 抱歉打乱了问题,我 $this->getTeam($id) 查询数据库并返回特定事件的团队名称和数据。即 man utd vs chelsea,第一个查询返回带有两个团队 id 的事件,然后是函数 getTeam 我想要每个团队的数据,而不仅仅是我们当前所在的事件函数中设置的 id

标签: php arrays for-loop foreach while-loop


【解决方案1】:

这是我最后使用的东西,对于措辞不佳的问题感到抱歉。有没有更好的方法来做到这一点,这里是代码,然后是 print_r() 转储供您查看我的目标。

$stmt = $this->conn->prepare('
  SELECT * from events WHERE cid = :cid
');

$stmt->bindParam( ':cid', $categoryid, PDO::PARAM_INT );

if( $stmt->execute() )
{
    $result = $stmt->fetchAll( PDO::FETCH_ASSOC );

    $resultCount = count($result);

    for( $i = 0; $i < $resultCount; $i++ ) {

        $result[$i]['homeTeamData'] = $this->getTeam( $result[$i]['eHome'] );
        $result[$i]['awayTeamData'] = $this->getTeam( $result[$i]['eAway'] );
    }
}

下面是 print_r(),它添加了一个额外的 awayTeamData 和 homeTeamData 以及上面添加的循环中收集的数据

大批 ( [0] => 数组 ( [开斋节] => 1 [eTitle] => 超级联赛 [eDesc] => [cid] => 1 [删除] => 0 [eStartTime] => 15:00 [eHome] => 1 [轻松] => 2 [eKickoff] => 15:00:00 [日期] => 2016-08-20 [homeTeamData] => 数组 ( [tid] => 1 [tName] => 切尔西 [删除] => 0 ) [awayTeamData] => 数组 ( [tid] => 2 [tName] => 曼联 [删除] => 0 ) ) [1] => 数组 ( [开斋节] => 2 [eTitle] => 足总杯 [eDesc] => [cid] => 1 [删除] => 0 [eStartTime] => 15:00 [eHome] => 1 [轻松] => 2 [eKickoff] => 15:00:00 [日期] => 2016-08-27 [homeTeamData] => 数组 ( [tid] => 1 [tName] => 切尔西 [删除] => 0 ) [awayTeamData] => 数组 ( [tid] => 2 [tName] => 曼联 [删除] => 0 ) ) )

【讨论】:

  • getTeam 是做什么的?
  • getTeam 是一个查询数据库的函数,在这种情况下会返回 [homeTeamData] 和 [awayTeamData] 但如果未提供 $tid 但该函数能够返回数据库中的所有团队如果提供了 id,则只返回一个团队。
  • 您应该更好地编辑您的问题,而不是将其作为答案。还提供函数“getTeam”。
  • 你仍然可以通过加入来做到这一点
  • 谢谢杰夫,我早上会编辑,从今天开始我的头有点炸了,但我会编辑它,看看你或其他人是否可以改进我的答案,加入这个 dagon 可能更好也说。当我起床时,我将使用 2 个表结构进行编辑。感谢您今天对我的包容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2011-08-21
  • 2016-06-21
  • 2022-12-26
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多