如何读取 PHP 中 COM 对象返回的多维变量数组?

发布于 2024-10-13 21:52:50 字数 922 浏览 9 评论 0原文

我正在使用一个返回多维 VARIANT 数组 (vt_array) 的 COM 对象,并且我正在尝试从该数组中读取值。

当我使用 print_r($mdArray) 时,它显示 variant Object。 (variant_get_type($mdArray) 返回 8204。)

我尝试使用 foreach ($mdArray as $oneArray) 但收到消息:

警告:Loader::getfields() [loader.getfields]:只能处理 单维变体数组(这 数组有 2) 中 C:\Inetpub\wwwroot\root\script\fileloader.php 第 135 行致命错误:未捕获 带有消息的异常“异常” '类型变体的对象未创建 迭代器' in C:\Inetpub\wwwroot\root\script\fileloader.php:135 堆栈跟踪:#0 C:\Inetpub\wwwroot\root\script\fileloader.php(135): 加载器::getfields() #1 C:\Inetpub\wwwroot\root\testloader.php(21): Loader->getfields() #2 {main} 抛出 在 C:\Inetpub\wwwroot\root\script\fileloader.php 第135行

(foreach 循环位于第 135 行)

我可以获得的有关数组的唯一信息是使用返回 8count($mdArray)

如果这里有人有读取多维 VARIANT 数组的经验,请告诉我如何做到这一点。

I'm working with a COM object that returns a multidimensional VARIANT array (vt_array), and I'm trying to read values from the array.

When I use print_r($mdArray) it displays variant Object.
(variant_get_type($mdArray) returns 8204.)

I tried using foreach ($mdArray as $oneArray) but I get the message:

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

(The foreach loop is on line 135)

The only information I can get about the array is by using count($mdArray) which returns 8.

If anyone here has any experience reading from multidimensional VARIANT arrays please tell me how this can be done.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

万劫不复 2024-10-20 21:52:51

尝试通过“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以关闭任何屏幕上的弹出窗口。否则,如果从 VBScript 中以某种方式调用 MsgBox() 并且没有人在服务器终端上单击“确定”,它将冻结请求。

Try this to extract array values through "VBScript". Yes, you read that right...

<?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";
    }

?>

Tested good on a VBScript-created array, which otherwise gave me the exact same issues and errors as you when trying to coerce it to behave like a PHP array. The above method spawned by the unholy union of PHP and VBscript should extract values piece by piece just fine.

To explain $y1 = 0; $y2 = 1;, keep in mind the parameters of the VBScript function are byref, so you can't pass anything in except a variable.

Edit: Added $com->AllowUI = false to shut off any on-screen popups. Otherwise it would freeze the request if a MsgBox() somehow got called from VBScript and no one was at the server terminal to click 'ok'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文