【问题标题】:Replace multidimensional array value with new value用新值替换多维数组值
【发布时间】:2014-10-23 18:34:51
【问题描述】:

目前我有这个工作代码,它将用从 db 获取的新值替换旧多维数组中的值。首先,我声明了 12 个月的数组。代码如下:

$base = Array(
    Array
        (
            "month" => '2010-01',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),

    Array
        (
            "month" => '2010-02',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),

    Array
        (
            "month" => '2010-03',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ), 

    Array
        (
            "month" => '2010-04',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),               

    Array
        (
            "month" => '2010-05',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),               

    Array
        (
            "month" => '2010-06',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),               

    Array
        (
            "month" => '2010-07',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),


    Array
        (
            "month" => '2010-08',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),               

    Array
        (
            "month" => '2010-09',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),               


    Array
        (
            "month" => '2010-10',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),

    Array
        (
            "month" => '2010-11',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
        ),   

    Array
        (
            "month" => '2010-12',
            "KFC" => '0',
            "PZH" => '0',
            "SUB" => '0'
         )                                         
    );

$result = mysqli_query($con, "SELECT brand, 
DATE_FORMAT( date_time, '%Y' ) AS 'year', 
DATE_FORMAT( date_time, '%m' ) AS 'month', 
SUM(brand='PZH') AS PZH,
SUM(brand='KFC') AS KFC,
SUM(brand='SUB') AS SUB
FROM scan_report WHERE DATE_FORMAT( date_time, '%Y' ) =2010 AND id = ".$_SESSION['userinfo']['id']."
GROUP BY DATE_FORMAT( date_time, '%Y%m' )") or die(mysqli_error($con));
$num_rows = 1;  

while ($row = mysqli_fetch_array($result)) {
foreach($base as &$value) {

    echo $num_rows;     
    if ($value['month'] == $row['year'].'-'.$row['month']){     
        $value['KFC'] = $row['KFC'];
        $value['PZH'] = $row['PZH'];
        $value['SUB'] = $row['SUB'];

     }

}
$num_rows++;
}   

因为是多维数组,for each循环了12次。在回显期间,从 db 查询时,有 5 个匹配记录的 60 个循环。有没有比我目前正在做的更优雅的解决方案?有什么想法可以减少循环吗?

【问题讨论】:

    标签: php arrays performance multidimensional-array


    【解决方案1】:

    最好的办法是获取 month 值并将其用作数组中的键:

    $base = Array(
        '2010-01' => Array
            (
                "month" => '2010-01',
                "KFC" => '0',
                "PZH" => '0',
                "SUB" => '0'
            ),
         // ... and so on
        );
    

    然后你可以这样搜索:

    while ($row = mysqli_fetch_array($result)) {
        $searchKey = $row['year'].'-'.$row['month'];
        if (isset($base[$searchKey])) {
            $base[$searchKey]['KFC'] = $row['KFC'];
            $base[$searchKey]['PZH'] = $row['PZH'];
            $base[$searchKey]['SUB'] = $row['SUB'];
        } else {
            $base[$searchKey] = array(
                'KFC' => $row['KFC'],
                'PZH' => $row['PZH'],
                'SUB' => $row['SUB'],
            );
        }
        $num_rows++;
    }   
    

    【讨论】:

      【解决方案2】:

      我不会预定义数组值,而是更喜欢使用年月作为键(它是独一无二的,因为它是按它分组的)。

      $base = array();
      while($row = mysqli_fetch_array($result)) {
          echo $num_rows;
          $key = $row['year'].'-'.$row['month'];
          $base[$key] = array();
          $base[$key]['KFC'] = $row['KFC'];
          $base[$key]['PZH'] = $row['PZH'];
          $base[$key]['SUB'] = $row['SUB'];
          $num_rows++;
      }
      

      【讨论】:

        【解决方案3】:

        我喜欢在这种情况下使用关联多维数组。例如,您可以按如下方式排列基本数组:

        $base = array('2010-01' => array(
                "KFC" => '0',
                "PZH" => '0',
                "SUB" => '0'
            ),
            '2010-01' => array(
                "month" => '',
                "KFC" => '0',
                "PZH" => '0',
                "SUB" => '0'
            ) //etc
            );
        

        然后,当您处理来自数据库的结果时,您可以访问 $base 数组的特定部分,例如:

        while ($row = mysqli_fetch_array($result)) {
        
        $base[$row['year'] . '-' . $row['month']]['KFC'] = $row['KFC'];
        $base[$row['year'] . '-' . $row['month']]['PZH'] = $row['pZH'];
        $base[$row['year'] . '-' . $row['month']]['SUB'] = $row['SUB'];
        
        }
        

        然后你只需要遍历数据库行来实现更新过程。有意义吗?

        【讨论】:

        • 对不起,其他人显然比我早。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 2017-11-07
        相关资源
        最近更新 更多