【问题标题】:foreach multiple arrays and group values determined by an ID value on each arrayforeach 多个数组并分组由每个数组上的 ID 值确定的值
【发布时间】:2016-08-07 11:40:20
【问题描述】:

我正在尝试使用 foreach 循环遍历多个数组并将值分成由每个数组上的 ID 值确定的 2 个组,然后将它们回显到一个表中。

例如,我有如下给定的 2D 数组:(我仅使用 3 作为示例,但实际上会有更多)

Array
(
    [results] => Array
        (

            [numbpeople] => 3
            [people] => Array
                (
                    [0] => Array
                        (
                            [name] => bert
                            [mainId] => 2
                            [beens] => 0
                            [coins] => 8
                            [total] => 3
                            [ammount] => 2
                            [place] => 15
                            [type] => 0

                        )

                    [1] => Array
                        (
                            [name] => bungle
                            [mainId] => 1
                            [beens] => 0
                            [coins] => 4
                            [total] => 0
                            [ammount] => 10
                            [place] => 13
                            [type] => 0

                        )
                    [2] => Array
                        (
                            [name] => fred
                            [mainId] => 2
                            [beens] => 0
                            [coins] => 3
                            [total] => 1
                            [ammount] => 8
                            [place] => 11
                            [type] => 0

                        )

                  )

            )

      )

我尝试了以下代码,但它并没有按照预期的方式工作。

//foreach ($data['results']['people'] as $pValue) {
foreach ($data['results']['people'] as $Key => $pValue) {
$numPeople = $data["results"]["numbpeople"]; //[$i];

    if($numPeople>-1)
    {
        $MainId1="";
        $MainId2="";

        // set up header
        echo "<strong>People:<br>name, beens, coins, total.</strong><br>";
        echo "<br>";

        // calculate who's got what?
        $i=0;       
        while($i<$numPeople)
        {
                $pname[$i]=$pValue["name"][$i];
                $pmainId[$i]=$pValue["mainId"][$i];
                $pbeens[$i]=$pValue["beens"][$i];
                $pcoins[$i]=$pValue["coins"][$i];
                $ptotal[$i]=$pValue["total"][$i];
                if(!stristr($pValue["mainId"],"1") && !stristr($pValue["mainId"],"2")) {


                    if($pmainId[$i]!=$MainId1 && $MainId1=="") {
                        $p1Name=$pname[$i];         // people1 name
                        $p1Beens=$pbeens[$i];       // people1 beens
                        $p1Coins=$pcoins[$i];       // people1 coins
                        $p1Total=$ptotal[$i];       // people1 total
                    }
                    if($pmainId[$i]!=$MainId1 && $MainId1!="" && $MainId2=="") {
                        $p2Name=$pname[$i];         // people2 name
                        $p2Beens=$pbeens[$i];       // people2 beens
                        $p2Coins=$pcoins[$i];       // people2 coins
                        $p2Total=$ptotal[$i];       // people2 total
                    }   

                    // Id
                    if($pmainId[$i]!=$MainId1 && $MainId1=="") {
                        $MainId1=$pmainId[$i];
                    }
                    if($pmainId[$i]!=$MainId1 && $MainId1!="" && $MainId2=="") {
                        $MainId2=$pmainId[$i];
                    }       
                } else {
                    $MainId1="1";
                    $MainId2="2";
                }

            // output people ?

                echo $i.". -> ".$p1Name[$i].", ".$p1Beens[$i].", ".$p1Coins[$i].", ".$p1Total[$i];
                //    1            bungle             0                 4                 0
                echo "<br>";
                echo $i.". -> ".$p2Name[$i].", ".$p2Beens[$i].", ".$p2Coins[$i].", ".$p2Total[$i];
                //    1             bert              0                 8                 3
                //    2             fred              0                 3                 1
                echo "<br>";
                echo $MainId1, $MainId2;
                //       1         2
                echo "<br>";


            $i++;
        }

                }else   {

                echo "No people";
        }
    }

更好的更精细的解决方案会很有帮助。

【问题讨论】:

  • 什么不起作用?
  • 请提供您希望获得的数据结构作为您给出的示例输入的输出。注意:在样本输入numbpeople 中看到三个条目的数组时为 2,这很奇怪。这种区别是什么意思?
  • 抱歉错字已更正

标签: php multidimensional-array foreach


【解决方案1】:

查看代码后的一些建议:

  • 在发送数据以供查看之前准备数据
  • 接下来尝试从视图中分离逻辑

我的回答显示了如何通过 id 将数组分隔为数组:

$people=$results["results"]["people"];
$result=[];
$count=count($people);// i don't need special numbpeople in array

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

  $id=$people[$i]['mainId'];

  if (!isset($result[$id]))
  $result[$id]=[];//create new array for this id

  $result[$id][]=$people[$i]; //add people to this collection

}

在上面的循环结果之后,我们有这个结构:

[ 
1 => [ [peopley],[peoplex] ]
2 => [ [peoplez],[peoplew] ]
....
]

此结构按 mainId 分组。

如何从上面的结构中显示人:

$size=count($result)
for ($i=0;$i<$size; $i++){

    //loop on groups

    $peoples=$result[$i];//array with people in this group
    $groupSize=count($peoples);

    for ($j=0;$j<$groupSize; $j++){

      //loop in group
      echo $peoples[$j]["name"];//example show name
    }
}

【讨论】:

  • @Renny 我在这里写了代码,没有测试过,我忘了关闭)。代码已修复。检查一下。
  • 这是标准的 php 数组 $arr=[] 与 $arr=array(); 相同如果您有语法错误,请将其更改为 array(),但您必须使用非常旧的 PHP。
  • 是的,它可以是其他东西,它只是示例变量名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2016-12-18
  • 2015-11-18
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多