【问题标题】:How do you read from a multidimensional variant array returned from a COM object in PHP?如何从 PHP 中的 COM 对象返回的多维变量数组中读取?
【发布时间】:2011-01-26 01:47:51
【问题描述】:

我正在使用一个返回多维 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 行致命错误:未捕获 带有消息的异常“异常” '类型变量的对象没有创建 一个迭代器'在 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 行)

我能得到的关于数组的唯一信息是使用count($mdArray),它返回8

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

【问题讨论】:

  • 您知道 com 对象是用哪种语言编写的数组的确切类/类型吗?我已经担心您可能不得不尝试在 VB 中解析数组...提示:$vb_control = new COM("MSScriptControl.ScriptControl");
  • 你也试过for ($x=0; $x < count($mdArray); $x++) $oneArray = $mdArray[$x];循环吗?
  • 我尝试了 $oneArray = $mdArray[0] 并且整个脚本因以下消息而崩溃:FastCGI 错误 FastCGI 处理程序无法处理请求。错误详细信息:* FastCGI 进程意外退出 * 错误号:-2147467259 (0x80004005)。 * 错误描述:未指定的错误 HTTP 错误 500 - 服务器错误。 Internet 信息服务 (IIS)
  • 我唯一知道的是它是一个多维数组,每个单独的数组包含 2 个字符串。我不知道数组是如何实现的或用于创建数组的类/类型。我是这份工作的新手,我正在尝试使用一个 COM 对象,该对象是由离开公司且我无法联系的人编写的。

标签: php multidimensional-array variant comobject


【解决方案1】:

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

【讨论】:

  • 太棒了!非常感谢!这段代码效果很好。 (我没有足够的声誉来支持您的答案,但我真的很感激。)是否可以反转此脚本,以便我可以创建多维数组以发送到 COM 对象?
  • 谢谢!不幸的是,当你倒车时会遇到同样的问题。但是,您可以在 VBScript 中对它进行 foeach 循环。我唯一能想到的就是制作一个 VBScript 函数来 1)接收一个 PHP 多维数组,2)在它上面使用嵌套的 foreach 循环构建一个全新的有效数组,3)将它返回给 PHP,然后返回到你的 COM对象。
  • @bob-the-destroyer 你的回答让我知道了如何处理这种类型的场景。当我发出 var_dump($myArrayObject); 时,我在 Php 中有一个 COM 对象,返回 object(variant)#3(0){ };我将如何处理这个?
  • @bob-the-destroyer 你能帮我解决这个问题吗stackoverflow.com/questions/42166123/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多