Я работаю с 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».