如何读取 PHP 中 COM 对象返回的多维变体数组?
-
22-10-2019 - |
题
我正在使用一个返回多维 VARIANT 数组 (vt_array) 的 COM 对象,并且我正在尝试从该数组中读取值。
当我使用 print_r($mdArray)
它显示 variant Object
.
(variant_get_type($mdArray)
回报 8204
.)
我尝试使用 foreach ($mdArray as $oneArray)
但我收到消息:
警告:Loader::getfields() [loader.getfields]:只能处理C: inetpub wwwroot root script fileloader.php在第135行135致命错误:未抓获 带信息的 "异常 未创建变体类型的对象 中的 "迭代器"。 C:\Inetpub\wwwroot oot\script\fileloader.php:135 堆栈跟踪:#0 C:\Inetpub\wwwroot oot\script\fileloader.php(135):加载器::getfields() #1 C:\Inetpub\wwwroot oot estloader.php(21):Loader->getfields() #2 {main} 抛出 于 C:\Inetpub\wwwroot oot\script\fileloader.php 第 135 行
(foreach 循环位于第 135 行)
我可以获得有关数组的唯一信息是使用 count($mdArray)
返回 8
.
如果这里有人有读取多维 VARIANT 数组的经验,请告诉我如何做到这一点。
解决方案
尝试通过“VBScript”提取数组值。是的,你没有看错...
<?php
$com = new COM("MSScriptControl.ScriptControl");
$com->Language = 'VBScript';
$com->AllowUI = false;
$com->AddCode('
Function getArrayVal(arr, indexX, indexY)
getArrayVal = arr(indexX, indexY)
End Function
');
$y1 = 0;
$y2 = 1;
for ($x=0; $x < count($mdArray); $x++) {
echo $com->Run('getArrayVal', $mdArray, $x, $y1) . ": ";
echo $com->Run('getArrayVal', $mdArray, $x, $y2) . "\n";
}
?>
在 VBScript 创建的数组上测试良好,否则在尝试强制它像 PHP 数组一样运行时,它会给我带来与您完全相同的问题和错误。上述由 PHP 和 VBscript 的邪恶结合产生的方法应该可以很好地逐段提取值。
解释 $y1 = 0; $y2 = 1;
, ,请记住 VBScript 函数的参数是 byref,因此除了变量之外不能传递任何内容。
编辑: 添加 $com->AllowUI = false
关闭任何屏幕上的弹出窗口。否则,如果出现以下情况,它将冻结请求: MsgBox()
不知何故从 VBScript 调用,但服务器终端上没有人单击“确定”。