PHP将foreach值与多维数组匹配

时间:2014-10-02 11:34:29

标签: php arrays multidimensional-array foreach

我有以下数组:

    Array
    (
        [0] => Array
            (
                [year] => 1
                [month] => Array
                    (
                        [0] => Array
                            (
                                [month] => 2
                                [value] => 600
                            )

                        [1] => Array
                            (
                                [month] => 3
                                [value] => 600
                            )

                        [2] => Array
                            (
                                [month] => 4
                                [value] => 600
                            )
                    )
            )
        [1] => Array
            (
                [year] => 5
                [month] => Array
                    (
                        [0] => Array
                            (
                                [month] => 6
                                [value] => 80
                            )

                        [1] => Array
                            (
                                [month] => 7
                                [value] => 90
                            )

                        [2] => Array
                            (
                                [month] => 8
                                [value] => 100
                            )
                    )
            )
    )

并且我也有一个10年的foreach,也是每个月的foreach。像这样:

foreach (range(1, 10) as $year) {
     foreach (range(1, 12) as $month) {
            $value = $month;
     }
}

现在问题是如何将数组与foreach匹配,如果数组中的$ year和$ month更改$ value,并且如果数组中的年/月组合$ value值需要是阵中那个月的那个。

3 个答案:

答案 0 :(得分:0)

你的问题很模糊,但这可能对你有所帮助。这将通过您的年/月数组,检查年份是否对应,如果是,它将检查月份是否匹配,如果是显示值。

年和月范围将匹配您的所有数据数组条目。

foreach (range(1, 10) as $year) {
     foreach (range(1, 12) as $month) {
        foreach($ar as $row){
            if ($row['year'] == $year){
                foreach($row['month'] as $rowMonth){
                    if($rowMonth['month'] == $month){
                        echo "match: Y:".$row['year']." - m:".$rowMonth['month']." -> ". $rowMonth['value']."<br>"; 
                    }

                }
            }
        }
     }
}

答案 1 :(得分:0)

你的意思是这样吗?

$year_month = array( array( 'year' => 1, 'month' => array( array('month' => 2, 'value' => 600), array('month' => 3, 'value' => 600), array('month' => 4, 'value' => 600) ) ), array( 'year' => 5, 'month' => array( array('month' => 6, 'value' => 80), array('month' => 7, 'value' => 90), array('month' => 8, 'value' => 100) ) ) );

foreach($year_month as $year) { foreach($year['month'] as $month) { $value = $month['value']; echo $value.'<br/>'; } }

输出:

600 600 600 80 90 100

答案 2 :(得分:0)

写完下面的内容后,值得一提的是整个练习似乎有点无意义。 当您在十年内每个月进行迭代时,迭代数据并检查年份是否匹配(因为那一年中没有一个月可以在逻辑上超出1-12的范围)会更加简单,而不是迭代120个月,以查看数据是否包含该月的值:

foreach($data as $year_data) {
    if(in_array($year_data['year'], range(1,10)){
        foreach($year['month'] as $month) {
            echo = $month['value'];
        }
    }
}

不清楚你想要对数据做什么,但要实现它,你需要使用嵌套的foreach循环迭代数组:

foreach (range(1, 10) as $year) {
    foreach (range(1, 12) as $month) {
         //iterate the array to find the correct element
         $foundValue = false;
         foreach($data as $year_data){
            if($year_data['year']==$year){
                foreach($year_data['month'] as $month_data){
                    if($month_data['month']==$month){
                        //do something with the data
                        $foundValue = $month_data['value'];
                    }
                }
            }
        }
        echo ($foundValue) ?: $defaultValue;
    }
}

如果您可以重新构建要按年和月编制索引的数据数组,例如:

$data = array(
      'year_1'=>array(
                      'month_2'=>600,
                      'month_3'=>600,
                      'month_4'=>600
                     ),
      'year_5'=>array(
                      'month_6'=>80,
                      'month_7'=>90,
                      'month_8'=>100
                     ),
     );

然后您可以更轻松地访问数据:

foreach (range(1, 10) as $year) {
    foreach (range(1, 12) as $month) {
         //access value directly via keys:
         if(isset($data['year_'.$year]['month_'.$month];)){
             echo $data['year_'.$year]['month_'.$month];
         }else{
             echo $defaultValue;
         }
    }
}

即使您无法改变数据的创建方式,您仍然可以使用上述结构创建一个新数组:

$newData = array();

foreach($data as $year_data){
    $year = 'year_'.$year_data['year'];
    $months = array();
    foreach($year_data['month'] as $month_data){
        $months['month_'.$month_data['month']]=$month_data['value'];
    }
    $newData[$year]=$months;
}

然后,您可以在上面的简化示例中使用$newData代替$data