一个更优雅的解决方案,用于处理数组数组缺少键时的单个输入

时间:2017-01-10 17:01:38

标签: php arrays

我可以使用以下SQL数据提取格式存储在变量$data中。

YEAR QUARTER CAT     NAME   ASSMT_TOTAL
2011    Q2  2011-Q2 Place-1 18
2011    Q3  2011-Q3 Place-1 22
2011    Q4  2011-Q4 Place-2 34
2011    Q3  2011-Q3 Place-2 21
2011    Q4  2011-Q4 Place-2 23

我正在尝试构建一个包含数组数组的“final”数组。每个数组都如下所示:

[name] => Place-1
[type] => line
[data] => Array
(
   [0] => 18
   [1] => 22
   ...
)

我已经完成了绝大多数,但我很少在place没有特定类别的记录的情况下挣扎。

$names是所有地点的数组,$cats是所有可用类别名称(2011-Q2)的数组。

  foreach($names as $s)
  {
    foreach($cats as $c)
    {
      $temp['name'] = $s;
      $temp['type'] = 'line';
      foreach($data as $d)
      {
        if($s === $d['NAME'] && $c === $d['CAT'])
        {
          $temp['data'][] = (int)$d['ASSMT_TOTAL'];
          break;
        }
        //$temp['data'][] = 0;
      }
    }
    $final[] = $temp;
    unset($temp);
  }

上述方法效果很好,除了处理网站没有相应类别的奇怪时间。例如,在我的示例数据中,place-2没有2011年第二季度的CAT。在这种情况下如何插入零。我也想知道双循环情况的更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

由于你已经有了一个$ cats的列表,你可以比较你的行类别(我假设$ d [' CAT'])与该数组相比,并使它成为一个极端情况。

$catFoundMarker = false;
foreach($data as $d)
{
    if($s === $d['NAME'] && $c === $d['CAT'])
    {
          $temp['data'][] = (int)$d['ASSMT_TOTAL'];
          $catFoundMarker = true;
          break;
    }
}
if(!$catFoundMarker){
    $temp['data'][] = 0;
}

您可以为“' NAME”创建一个类似的角落案例。不存在。

编辑:抱歉,更新了in_array函数中的错误 EDIT2:更新的解决方案