繁体   English   中英

如何合并两个循环的关联数组?

[英]How can I merge two associative arrays that are being looped?

我试图从数据库运行两个查询。 我需要两个查询来创建一个具有相同列名的数组,然后将两个数组合并在一起。

这是我的两个问题:

## Order History
$q47 = "SELECT OCODT AS COMPDT, ORDNO AS ORDER, ORQTY AS OQTY, 
               QTYRC AS RQTY FROM AMFLIBP.MOHMST WHERE FITEM='$id' AND FITWH='$wh'";
$stmt47 = db2_prepare($con, $q47);
$result47 = db2_execute($stmt47);

$q48 = "SELECT DOKDT AS COMPDT, ORDNO AS ORDER, QTYOR AS OQTY, 
               DKQTY AS RQTY, VNDNR AS VNDR FROM AMFLIBP.POHISTI 
        WHERE ITNBR='$id' AND HOUSE='$wh'";
$stmt48 = db2_prepare($con, $q48);
$result48 = db2_execute($stmt48)

我想对两个查询做一个while语句。

所以,看起来像这样:

while($fin47 = db2_fetch_assoc($stmt47));

and

while($fin48 = db2_fetch_assoc($stmt48));

在while语句完成之后,

我想从两个while语句中获取结果并将它们放入按COMPDT排序的COMPDT

我试过这样做:

## Order History
$q47 = "SELECT OCODT AS COMPDT, ORDNO AS ORDER, ORQTY AS OQTY, QTYRC AS RQTY 
        FROM AMFLIBP.MOHMST 
        WHERE FITEM='$id' AND FITWH='$wh'";

$stmt47 = db2_prepare($con, $q47);
$result47 = db2_execute($stmt47);
while($fin47 = db2_fetch_array($stmt47));

$q48 = "SELECT DOKDT AS COMPDT, ORDNO AS ORDER, QTYOR AS OQTY, DKQTY AS RQTY, 
               VNDNR AS VNDR FROM AMFLIBP.POHISTI 
        WHERE ITNBR='$id' AND HOUSE='$wh'";

$stmt48 = db2_prepare($con, $q48);
$result48 = db2_execute($stmt48);
while($fin48 = db2_fetch_array($stmt48));

$array = array_merge($fin47, $fin48);
print_r($array);

来自print_r($array);

我的php.log以下错误:

[29-Dec-2013 09:17:03 Antarctica/Mawson] PHP Warning:  
array_merge(): Argument #1 is not an array in 
     /www/zendsvr6/htdocs/views/test.php on line 42

我知道while语句导致问题,因为我之前已经完成了array_merge。 这与我的语法有关。 有任何想法吗? 提前致谢!

增加的信息:

通过做这个:

## Order History
$q47 = "SELECT OCODT AS COMPDT, ORDNO AS ORDER, ORQTY AS OQTY, QTYRC AS RQTY 
        FROM AMFLIBP.MOHMST WHERE FITEM='$id' AND FITWH='$wh'";

$stmt47 = db2_prepare($con, $q47);
$result47 = db2_execute($stmt47);
while($fin47 = db2_fetch_array($stmt47))
{var_dump($fin47);}

我明白了:

array(4) { [0]=> string(7) "1090225" [1]=> string(7) "M703760" 
           [2]=> string(6) "20.000"     
           [3]=> string(6) "20.000" } array(4) { [0]=> string(6) "960614" 
           [1]=> string(7) "M802110"     [2]=> string(7) "340.000" 
           [3]=> string(4) ".000" }

另外,当我尝试下面的建议时:

$q47 = "SELECT OCODT AS COMPDT, ORDNO AS ORDER, ORQTY AS OQTY, QTYRC AS RQTY 
        FROM AMFLIBP.MOHMST WHERE FITEM='$id' AND FITWH='$wh'";

$stmt47 = db2_prepare($con, $q47);
$result47 = db2_execute($stmt47);
while($fin47 = db2_fetch_array($stmt47))
{$array[] = $fin47;}
print_r($array);

我明白了:

Array ( [0] => Array ( [0] => 1090225 [1] => M703760 [2] => 20.000 [3] => 20.000 ) 
        [1] => Array ( [0] => 960614 [1] => M802110 [2] => 340.000 [3] => .000 ) )

哪个有效但丢失了我的专栏名称?

这一行:

while($fin47 = db2_fetch_array($stmt47));

SELECT的下一行覆盖$fin47每个值。 你应该做的是:

$fin47 = array();
while($fin47[] = db2_fetch_array($stmt47));

然而,这似乎是一种不必要的复杂的做事方式。 您可以使用一个查询以所需的形式提取数据,这意味着不需要所有PHP代码。

$fin47 = array();
$query = "SELECT OCODT AS COMPDT, ORDNO AS ORDER, ORQTY AS OQTY, QTYRC AS RQTY, null as VNDR FROM AMFLIBP.MOHMST WHERE FITEM='$id' AND FITWH='$wh'".
" UNION ALL ".
"SELECT DOKDT AS COMPDT, ORDNO AS ORDER, QTYOR AS OQTY, DKQTY AS RQTY, VNDNR AS VNDR FROM AMFLIBP.POHISTI WHERE ITNBR='$id' AND HOUSE='$wh'".
" ORDER BY COMPDT";
$stmt = db2_prepare($con, $query);
$result = db2_execute($stmt);
while($fin47[] = db2_fetch_array($stmt));

注意:我在第一个SELECTVNDR添加了一个虚拟值,以匹配UNION的列数。 在结果数组中,这些将显示为空值。

此循环将在每次运行时覆盖您的变量。 它不会收集行。 并且在最后一次运行中它将以false分配离开。

while($fin47 = db2_fetch_array($stmt47));

你应该做的是:

while($fin47 = db2_fetch_array($stmt47)) {
    $array[] = $fin47;
}

在你的第二个while你可以附加到相同的阵列。 因此,您的合并变得多余。

$fin47$fin48的原始产量是$fin48

你有没有试过对值进行简单的+

$array = $fin47 + $fin48;

编辑然后为什么不这样做。 我添加了名为$fin47_results$fin47_results并在每个查询中设置while循环,以将$fin47$fin48的值添加到它们:

## Order History
$q47 = "SELECT OCODT AS COMPDT, ORDNO AS ORDER, ORQTY AS OQTY, QTYRC AS RQTY FROM AMFLIBP.MOHMST WHERE FITEM='$id' AND FITWH='$wh'";
$stmt47 = db2_prepare($con, $q47);
$result47 = db2_execute($stmt47);
$fin47_results = array();
// while($fin47 = db2_fetch_assoc($stmt47)) {
while($fin47 = db2_fetch_array($stmt47)) {
  $fin47_results[] = $fin47;
}

$q48 = "SELECT DOKDT AS COMPDT, ORDNO AS ORDER, QTYOR AS OQTY, DKQTY AS RQTY, VNDNR AS VNDR FROM AMFLIBP.POHISTI WHERE ITNBR='$id' AND HOUSE='$wh'";
$stmt48 = db2_prepare($con, $q48);
$result48 = db2_execute($stmt48);
$fin48_results = array();
// while($fin48 = db2_fetch_assoc($stmt48)) {
while($fin48 = db2_fetch_array($stmt48)) {
  $fin48_results[] = $fin48;
}

$array = array_merge($fin48_results, $fin48_results);
print_r($array);

如果您注意到我还添加了 - 但注释掉了对db2_fetch_assoc的调用,因为您的最终目标和原始数据集不清楚。 但这应该有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM