我正在使用返回多维 VARIANT 数组 (vt_array) 的 COM 对象,并且我正在尝试从数组中读取值。
当我使用 print_r($mdArray)
时,它显示 variant Object
。
(variant_get_type($mdArray)
返回 8204
。)
我尝试使用 foreach ($mdArray as $oneArray)
但我收到消息:
Warning: Loader::getfields() [loader.getfields]: Can only handle single dimension variant arrays (this array has 2) in C:\Inetpub\wwwroot\root\script\fileloader.php on line 135 Fatal error: Uncaught exception 'Exception' with message 'Object of type variant did not create an Iterator' in C:\Inetpub\wwwroot\root\script\fileloader.php:135 Stack trace: #0 C:\Inetpub\wwwroot\root\script\fileloader.php(135): Loader::getfields() #1 C:\Inetpub\wwwroot\root\testloader.php(21): Loader->getfields() #2 {main} thrown in C:\Inetpub\wwwroot\root\script\fileloader.php on line 135
(foreach 循环在第 135 行)
关于数组我唯一能得到的信息是使用返回 8
的 count($mdArray)
。
如果这里有人有读取多维 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 调用并且没有人在服务器终端单击“确定”,它将卡住请求。
关于php - 在 PHP 中如何读取从 COM 对象返回的多维变体数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800728/