Как вы читаете из многомерного варианта массива, возвращаемого из COM-объекта в PHP?

Я работаю с COM-объектом, который возвращает многомерный массив VARIANT (vt_array), и я пытаюсь прочитать значения из массива.

Когда я использую print_r($mdArray) он отображает variant Object . ( variant_get_type($mdArray) возвращает variant_get_type($mdArray) )

Я попытался использовать 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): Loader :: 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, пожалуйста, скажите мне, как это можно сделать.

Попробуйте это, чтобы извлечь значения массива через «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; $y1 = 0; $y2 = 1; , имейте в виду, что параметры функции VBScript являются byref, поэтому вы не можете передавать ничего, кроме переменной.

Edit: добавлено $com->AllowUI = false чтобы отключить всплывающие окна. В противном случае он заморозил бы запрос, если MsgBox() каким-то образом получил вызов из VBScript, и никто не был на терминале сервера, чтобы нажать «ok».