【问题标题】:Multidimensional arrays in PHP - how to add values using foreachPHP 中的多维数组 - 如何使用 foreach 添加值
【发布时间】:2021-05-13 16:18:41
【问题描述】:

我有一个定义如下的多维数组

$SquadList = array('name', 'position', 'dob', 'nation', 'games', 'goals', 'assists');

我正在循环几个 foreach 循环并存储来自 JSON 的数据

foreach ($season as $key => $squad){
$SquadList[0] = $squad['full_name'];
$SquadList[1] = $squad['position'];
$SquadList[2] = gmdate("d-m-y", $birthday);
$SquadList[3] = $squad['nationality'];
$SquadList[4] = $squad['appearances_overall'];
$SquadList[5] = $squad['goals_overall'];
$SquadList[6] = $squad['assists_overall']; }

foreach ($season1 as $key => $squad){
$SquadList[0] = $squad['full_name'];
$SquadList[1] = $squad['position'];
$SquadList[2] = gmdate("d-m-y", $birthday);
$SquadList[3] = $squad['nationality'];
$SquadList[4] = $squad['appearances_overall'];
$SquadList[5] = $squad['goals_overall'];
$SquadList[6] = $squad['assists_overall'];

代码很乱。输出应该是 30+ 时只有 2 个元素

我试过array_push如下

array_push($SquadList['name'], $squad['full_name'];

【问题讨论】:

  • $SquadList = array('name', 'position', 'dob', 'nation', 'games', 'goals', 'assists'); 不是多维数组。也许你的意思是这样的数组?
  • 我遇到了几个“等等——什么?”事情:1)$SquadList 只是一个简单的数组。你的意思可能是$squadList[] = 2) 你在$season 的每次迭代中覆盖$SquadList。你的意思可能是$squadList[] = [$squad['full_name'], $squad['position'], ... ]; 3) 简单地使用json_decode() 4) 如果季节是一个数组,你也可以简单地循环它们,而不用一遍又一遍地编写相同的代码

标签: php json multidimensional-array


【解决方案1】:

我不确定我的问题是否正确,但我想你希望它的结构如下:

$SquadList = []; // define it as an array
$ctr = 0; // define a counter that would be used in the two iterations

foreach ($season as $key => $squad){
    $SquadList[$ctr][0] = $squad['full_name'];
    $SquadList[$ctr][1] = $squad['position'];
    $SquadList[$ctr][2] = gmdate("d-m-y", $birthday);
    $SquadList[$ctr][3] = $squad['nationality'];
    $SquadList[$ctr][4] = $squad['appearances_overall'];
    $SquadList[$ctr][5] = $squad['goals_overall'];
    $SquadList[$ctr][6] = $squad['assists_overall'];
    $ctr++; // increase counter
}

foreach ($season1 as $key => $squad){
    $SquadList[$ctr][0] = $squad['full_name'];
    $SquadList[$ctr][1] = $squad['position'];
    $SquadList[$ctr][2] = gmdate("d-m-y", $birthday);
    $SquadList[$ctr][3] = $squad['nationality'];
    $SquadList[$ctr][4] = $squad['appearances_overall'];
    $SquadList[$ctr][5] = $squad['goals_overall'];
    $SquadList[$ctr][6] = $squad['assists_overall'];
    $ctr++; // increase counter
}

【讨论】:

  • 谢谢你。我将如何显示$squad['full_name'] 的每次迭代?调用print_r($SquadList[0]); 只调用第一条记录。
  • 如果您遵循了我们的任何答案,print_r($SquadList[0]); 应该显示第一条记录的所有项目,而不仅仅是第一个 full_name 值。如果您只想显示小队全名的每一次迭代,您可以执行foreach($SquadList as $squad) { print_r($squad['full_name']); } 之类的操作。
【解决方案2】:

你有两个结果的原因是因为你得到了每个赛季的最后一支球队。发生这种情况是因为每次迭代一个赛季,它都会覆盖之前的阵容。

要解决这个问题,$SquadList 必须是一个数组。但是你必须一次分配它的所有成员,否则每次添加成员时数组都会增加。

填充数组数组


foreach ($season as $key => $squad) {
    $squadList[] = [
        $squad['full_name'],
        $squad['position'],
        gmdate("d-m-y", $squad['birthday']),
        $squad['nationality'],
        $squad['appearances_overall'],
        $squad['goals_overall'],
        $squad['assists_overall']
    ];
}

请注意我所做的一些更改:

  1. 我删除了 $squadList 上的大写字母,因为约定以表示对象的大写字母开头,而不是普通的旧变量
  2. $birthday 未定义,所以我做了一个有根据的猜测

清理代码

您提到“代码很乱”。这是一个非常健康的观察结果。

您注意到的是两件事的结果:

  1. 您的代码在重复自己(违反 DRY - 不要重复自己)
  2. 需要遵循 PSR-12 的约定

所以让我们摆脱代码重复

重构

当你开始重复自己时,这就是将事物拉入函数的信号

function buildSquad(array $season)
{
   foreach ($season as $key => $squad) {
        $squadList[] = [
            $squad['full_name'],
            $squad['position'],
            gmdate("d-m-y", $squad['birthday']),
            $squad['nationality'],
            $squad['appearances_overall'],
            $squad['goals_overall'],
            $squad['assists_overall']
        ];
    }
    return $squadList;
}

$squadList = [];

// if you just want to lump them all together
$squadList[] = buildSquad($season);
$squadList[] = buildSquad($season2);
// etc

【讨论】:

  • 谢谢。当我包含一个 IF 语句以仅从在变量 $clubId 中定义的 JSON txt 文件中提取数据时,此代码不返回任何内容,例如:function buildSquad(array $season) { foreach ($season as $key => $squad) { if ($clubID == $squad['club_team_id'] or $clubID == $squad['club_team_2_id']): $squadList[] = [... 我的代码使用 file_get_contents 从 txt 文件中提取 JSON 数据。然后我将这些文件一一读取并提取相关数据。
  • $clubID 是什么?那不在你的OP中。除非你将它传递给函数,否则它肯定不会在函数的范围内工作。函数知道的唯一外部数据是$season,因为它是传入的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2014-07-21
  • 2019-05-30
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多