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

Php 一个更优雅的解决方案,用于处理数组缺少键时的单个输入,php,arrays,Php,Arrays,我在变量$data中存储了以下SQL数据拉取格式 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 我正在尝试构建一个“最终”数组,它将包含一个数组数组。每个

我在变量
$data
中存储了以下SQL数据拉取格式

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
我正在尝试构建一个“最终”数组,它将包含一个数组数组。每个阵列将如下所示:

[name] => Place-1
[type] => line
[data] => Array
(
   [0] => 18
   [1] => 22
   ...
)
我已经做了绝大多数,但我正在为少数几次
场所
没有该特定类别的记录而奋斗

$names
是所有位置的数组,
$cats
是所有可用类别名称的数组(
2011-Q2


除了处理那些站点没有相应类别的奇数时间外,上述方法效果很好。例如,在我的示例数据中,
place-2
没有2011-Q2的CAT。在这种情况下,如何插入零。我还想知道一个更优雅的双for-loop解决方案。

既然您已经准备好了$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”不存在时,您可以创建一个类似的角盒

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

那么类别是否有一个整体数组?@nerdlyist如果您理解正确的话。是的,我的$cats数组是一个类型为['2011-Q2','2011-Q3',…]的数组。我回答了你的问题吗?我不确定这是否有效,因为其他行将存在
$d['CAT']
。很抱歉,我有点误解了你的数据,我已经更新了解决方案,在某种程度上,如果在foreach的循环中找不到名称类别,它将分配一个0。此过程将对您定义的数组中的所有其他项重复。谢谢!虽然超出了这个问题的范围,但你认为有没有更优雅的解决方案来解决这个问题,也许它不涉及两个for循环?可能,但现在是17:50,我的头在工作一天后(该回家了)没有正常工作。我会考虑一下,如果我有什么想法,我会更新答案。
$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;
}