【问题标题】:php array multidimensional count and foreachphp数组多维计数和foreach
【发布时间】:2016-12-06 11:57:41
【问题描述】:

我有一个如下所示的数组:

Array ( 
[0] => Array ( 
    [Time] => 00 
    [Activity] => Surfing 
    ) 
[1] => Array ( 
    [Time] => 00 
    [Activity] => Surfing 
    ) 
[2] => Array ( 
    [Time] => 00 
    [Activity] => Kayaking 
    ) 
[3] => Array ( 
    [Time] => 15 
    [Activity] => Surfing 
    ) 
)

但我很难以正确的格式获得所需的计数。基本上我希望实现的是每个“时间”内每个“活动”的计数。因此,例如,我想输出如下内容:

Time:00 - Surfing 2; Kayaking 1
Time:15 - Surfing 1; Swimming 2
Time:45 - Surfing 1

等等

我不确定我应该查看计数函数还是 foreach 中的 foreach?但这让我很难过。提前致谢。

【问题讨论】:

  • 你有什么尝试吗?
  • 我看不到输入如何导致所需的输出...
  • 你的问题不清楚。
  • @jeroen 和 pranav m.s - 请参阅下面的答案 ;-)
  • 是的,我敢肯定“游泳”和“45”会像那样神奇地出现;-)

标签: php arrays multidimensional-array foreach


【解决方案1】:

我的尝试似乎奏效了:

$array = array(
    array("time"=>"00", "Activity"=>"Surfing"), 
    array("time"=>"00", "Activity"=>"Surfing"), 
    array("time"=>"00", "Activity"=>"Kayaking"), 
    array("time"=>"15", "Activity"=>"Surfing")
    );

$sortedArr = array();

/* first we need to sort the array so that we have a new array that is formatted with the time value as the key */

foreach($array as $arr) {

    $timeVal      = $arr['time'];
    $activityName = $arr['Activity'];

    /* if there is a time and activity key already set then we'll increment the count. Otherwise, we'll set it as 1 */

    if(isset($sortedArr[$timeVal][$activityName])) {
        $sortedArr[$timeVal][$activityName]++;
    } else {
        $sortedArr[$timeVal][$activityName] = 1;
    }
}

/* now we've re-ordered things, we'll build the output and then echo it out */

$output = '';
foreach($sortedArr as $key=>$vals) {
    $output.= 'Time:'.$key.' - ';

    foreach($vals as $activityName=>$activityCount) {
        $output .= $activityName.' '.$activityCount.';'.PHP_EOL;
    }
}

echo $output;

【讨论】:

  • 这个似乎效果最好并且最灵活,所以我将其标记为答案。感谢大家的帮助!
  • 谢谢,很高兴你喜欢我的回答。
【解决方案2】:

你可以试试:

$timings = [];
foreach ($array as $activity) {
    $timings[$activity['Activity']][] = $activity['Time'];
}

$surfing = array_sum($timings['Surfing']);

【讨论】:

    【解决方案3】:

    如果嵌套数组的结构不会改变 你可以这样做:

    $array = [
        [
            "Time" => "00",
            "Activity" => "Surfing"
        ],
        [
            "Time" => "00",
            "Activity" => "Surfing"
        ],
        [
            "Time" => "00",
            "Activity" => "Kayaking"
        ],
        [
            "Time" => "15",
            "Activity" => "Surfing"
        ]
    ];
    $result = [];
    foreach ($array as $key => $value) {
        $time = $value["Time"];
        $activity = $value["Activity"];
        if (!isset($result[$time])) {
            $result[$time] = [];
        }
        if (!isset($result[$time][$activity])) {
            $result[$time][$activity] = 0;
        }
        $result[$time][$activity]++;
    }
    

    结束print_r($result)返回这个:

    Array
    (
    [00] => Array
        (
            [Surfing] => 2
            [Kayaking] => 1
        )
    
    [15] => Array
        (
            [Surfing] => 1
        )
    
    )
    

    【讨论】:

      【解决方案4】:
      $new_array = array();
      foreach ($array_list as $key => $val)
      {
           if(isset($new_array[$val[$time]][$val['Activity']]))
           {
               $new_array[$val[$time]][$val['Activity']] += 1;
           }
           else
           {
               $new_array[$val[$time]][$val['Activity']] = 1;
           }
      }
      

      下一步,无论您再次循环 new_array 以显示所有数组,您选择的每个唯一时间的新数组, 或者如果您需要它在新数据中进行比较,您可以直接访问新数组,如下所示

      echo $new_array['00']['Surfing']
      

      然后你会得到时间 00 的冲浪计数

      祝你好运

      【讨论】:

        【解决方案5】:

        我知道我迟到了,但这是我的代码。 输出你想要的。

        <?php
        
        //mockup
        $activities = array( 
                        array( 
                                "Time"     => "00",
                                "Activity" => "Surfing",
                          ), 
                        array( 
                                "Time"     => "00",
                                "Activity" => "Surfing",
                          ), 
                        array( 
                                "Time"     => "00",
                                "Activity" => "Kayaking", 
                          ), 
                        array( 
                                "Time"     => "15", 
                                "Activity" => "Surfing"
                            ), 
                        array( 
                                "Time"     => "15", 
                                "Activity" => "Swimming"
                            ), 
                        array( 
                                "Time"     => "15", 
                                "Activity" => "Swimming"
                            ), 
                        array( 
                                "Time"     => "45", 
                                "Activity" => "Surfing"
                            )  
        );
        
        $reordered = array();
        
        foreach($activities as $activity)
        {
            foreach($activity as $key => $value)
            {
                //echo "$key => $value <br>";
        
                if($key=="Time")
                {
                    $tmp_time = $value;
                }
                elseif($key=="Activity")
                {
                    if(!isset($reordered[$tmp_time][$value]))
                        $reordered[$tmp_time][$value]=1;
                    else
                    $reordered[$tmp_time][$value]++;
                }
            }
        }
        
        
        //var_dump($reordered);
        
        $output='';
        
        foreach($reordered as $key => $arr)
        {
            $output.='Time:' . $key . ' - ';
        
            foreach($arr as $activityName=>$activityCount) 
            {
                $output.= $activityName.' '.$activityCount.'; ';
            }
            $output = rtrim($output,"; ");
            $output.=PHP_EOL;
        }
        
        
        
        echo $output;
        
        /*
        
        Time:00 - Surfing 2; Kayaking 1
        Time:15 - Surfing 1; Swimming 2
        Time:45 - Surfing 1
        
        */
        

        【讨论】:

          猜你喜欢
          • 2017-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-30
          • 2015-08-13
          • 2012-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多