【问题标题】:Nesting Foreach Loops in PHP在 PHP 中嵌套 Foreach 循环
【发布时间】:2015-07-06 10:41:46
【问题描述】:

我有一个具有这种结构的类:

Class League
    Array Teams

Class Teams
    Array Players

Class Players
    String name

但是,如果我想获得联盟中所有球员的名单,这似乎不起作用:

foreach ($league->teams->players as $player) {
    echo $player->name;
}

我错过了什么?你必须使用两个 foreach 循环吗?

【问题讨论】:

  • foreach ($league->teams as $t => $p{ echo $p->name; } 我认为如果您将其作为键 => 值对循环,您将摆脱一层。
  • 除非你告诉我们 $league 是用什么初始化的,否则很难给出明确的答案。很可能您需要的是 Adrian 的答案。
  • 你有预付款吗?如果一个答案可以帮助您不要忘记检查已接受,如果您不知道如何阅读此 stackoverflow.com/tour

标签: php arrays oop multidimensional-array foreach


【解决方案1】:

看这个例子:

<?php

//Create your players
$player1 = new stdClass;
$player2 = new stdClass;
$player3 = new stdClass;

$player1->name = 'Mike';
$player2->name = 'Luke';
$player3->name = 'Smith';

//Create your teams
$team1 = new stdClass;
$team2 = new stdClass;

//Adding the players to their teams
$team1->Players = array($player1, $player2);
$team2->Players = array($player3);

//Create the league
$league = new stdClass;

//Adding the teams to the league
$league->Teams = array($team1, $team2);

//For each element in the Teams array get the team in $team
foreach ($league->Teams as $teams) {
//For each element in the Players array get the player in $player
  foreach($teams->Players as $player) {
//Print the name
    echo $player->name . "<br>\n";
  }
}

?>

输出:

Mike
Luke
Smith

【讨论】:

  • 这将是你最好的选择。
【解决方案2】:

所以这是三个独立的类,而不是一个类。您没有展示如何将这些类关联在一起以及如何实际创建数据结构。我不明白您认为您如何能够神奇地通过调用(例如 $league-&gt;teams-&gt;players)列出所有玩家,而无需在每个类中使用特定方法来处理嵌套对象中存储的数据的聚合。

如果不在你的类中定义这些关系,你需要像这样做嵌套循环:

foreach ($league->Teams as $team) {
    foreach($team->Players as $player) {
        echo $player->name;
    }
}

如果您想要方法,例如列出联赛级别的所有球员,您需要定义一个方法来执行此操作。可能是这样的:

在团队课中:

public function function get_all_players() {
    $return = array();
    if(count($this->Players) > 0) {
        $return = $this->Players;
    }
    return $return;
}

在联赛中:

public function get_all_players() {
    $return = array();
    if(count($this->Teams) > 0) {
        foreach($this->Teams as $team) {
            $return = array_merge($return, $team->get_all_players());
        }
    }
    return $return;
}

用法是:

foreach($league->get_all_players() as $player) {
    echo $player->name;
}

【讨论】:

    【解决方案3】:

    你可能需要两个嵌套的foreach

    foreach ($league->teams as $team;){
      foreach ($team->players as $player){
        $list[] = $player->name;
    
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多