【问题标题】:PHP 7.1 - Build associative Multidimensional Array from sql queryPHP 7.1 - 从 sql 查询构建关联多维数组
【发布时间】:2017-07-23 07:55:05
【问题描述】:

我有一个 sql server 表,像这样的 VATTable:

VatCode     |   VATRate     |   Description         |  Active
00              0               VAT Rate 0.00%        1
04              4               VAT Rate 4.00%        1
06              6               VAT Rate 6.00%        1
...
21              21              VAT Rate 21.00%       1
....

用这个查询

$query = "SELECT VatCode, VatRate, Description, 0 as Goods, 0 as eFees, 0 as pFees, 0 as sFees, 0 as VAT, 0 as Total from VATTable where active=1";
$result = sqlsrv_query($conn,$query);

我需要用这些数据构建一个多维数组,如下所示:

$VATTable = array
(
    '04'=> array(
        'VATRate'=>'4',
        'Desc'=>'VAT 4.00%',
        'Goods'=>0,
        'eFees'=>0,
        'pFees'=>0,
        'sFees'=>0,
        'Taxable'=>0,
        'VAT'=>0,
        'Total'=>0          
    ),
    '06'=> array(
        'VATRate'=>'06',
        'Desc'=>'VAT 6.00%',
        'Goods'=>0,
        'eFees'=>0,
        'pFees'=>0,
        'sFees'=>0,
        'Taxable'=>0,
        'VAT'=>0,
        'Total'=>0          
    ),
    '10'=> array(
        'VATRate'=>'10',
        'Desc'=>'VAT 10.00%',
        'Goods'=>0,
        'eFees'=>0,
        'pFees'=>0,
        'sFees'=>0,
        'Taxable'=>0,
        'VAT'=>0,
        'Total'=>0          
    )
);

以便能够通过以下方式对其进行管理:

$vatCode='10';
$VATTable[$vatCode]['Goods']=15;
echo $VATTable[$vatCode]['Desc'].': '.$VATTable[$vatCode]['Goods'];

虽然我的 php 知识很差,但我想我必须先构建内部数组,然后使用 array_push 添加到 VATTable 数组,但是在寻找这样的解决方案时, 我找到了一些我理解的示例(??),也许这可以在获取记录集时完成,我认为我可以这样做: $增值税表 = 数组();

while($row = sqlsrv_fetch_array($result))
{
   $VATTable[$row['VATCode']]['VATRate']=$row['VATRate'];
   $VATTable[$row['VATCode']]['Desc']=$row['Description'];
   $VATTable[$row['VATCode']]['Goods']=$row['Goods'];
};

但它不起作用。

可以提出解决方案吗?

谢谢

【问题讨论】:

    标签: php arrays sql-server multidimensional-array


    【解决方案1】:

    这应该可行:

    while($row = sqlsrv_fetch_array($result)) {
       $id = $row['VATCode'];
       $VATTable[$id] = [
          'VATRate' => $row['VATRate'],
          'Desc' => $row['Description'],
          'Goods' => $row['Goods'],
    }
    
    print_r($VATTable);
    

    另外,php7 中不需要“数组”这个词。 你可以使用

    $VATTable[$id] = [ ... ]
    

    而不是

    $VATTable[$id] = array( ... );
    

    如果您不想对索引进行硬编码:

    while($row = sqlsrv_fetch_array($result)) {
       $id = $row['VATCode'];
       $VATTable[$id] = $row;
       unset($VATTable[$id]['VATCode']);
    }
    

    【讨论】:

    • 是的,seen 数组不是必需的,但因为它不起作用.. 也用旧符号测试.. 你的解决方案更紧凑,虽然可以避免更多的行,但这对我来说也很容易。由于字段很少,这个解决方案对于这个例子来说是可以的,但是如果有大量的字段并且想要避免硬编码索引怎么办?
    • 以前的答案很清楚..为此必须学习很多,但它有效。
    【解决方案2】:
    while($row = sqlsrv_fetch_array($result))
    {
          $tempVariable = array (
            'VATRate'=>$row['VATRate'],
            'Desc'   =>$row['Description'],
            'Goods'  =>$row['Goods'],
            'eFees'  =>$row['eFees'],
            'pFees'  =>$row['pFees'],
            'sFees'  =>$row['sFees'],
            'Taxable'=>$row['Taxable'],
            'VAT'    =>$row['VAT'],
            'Total'  =>$row['Total']  
         ); 
     $VATTable[$row['VatCode']] = $tempVariable;
    };
    

    现在 $VATTable 包含您的多维数组

    【讨论】:

    • 是的,两者都很好用,但是如何避免硬编码索引和任意数量的字段呢?
    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2011-08-13
    • 2015-09-01
    相关资源
    最近更新 更多