Как вы читаете из многомерного варианта массива, возвращенного из объекта COM в PHP? - PullRequest
3 голосов
/ 26 января 2011

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

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

Я пытался использовать foreach ($mdArray as $oneArray), но получаю сообщение:

Предупреждение: Loader :: getfields () [loader.getfields]: может обрабатывать только одномерные вариантные массивы (это массив имеет 2) в C: \ Inetpub \ Wwwroot \ корень \ скрипт \ fileloader.php на линии 135 Неустранимая ошибка: Uncaught исключение «Исключение» с сообщением Объект типа не создан Итератор в C: \ Inetpub \ Wwwroot \ корень \ скрипт \ fileloader.php: 135 Трассировка стека: # 0 C: \ Inetpub \ Wwwroot \ корень \ скрипт \ fileloader.php (135): Loader :: getfields () # 1 C: \ Inetpub \ Wwwroot \ корень \ testloader.php (21): Loader-> getfields () # 2 {main} в C: \ Inetpub \ Wwwroot \ корень \ скрипт \ fileloader.php по линии 135

(цикл foreach находится в строке 135)

Единственная информация, которую я могу получить о массиве, это использовать count($mdArray), который возвращает 8.

Если у кого-нибудь здесь есть опыт чтения из многомерных массивов VARIANT, скажите, пожалуйста, как это можно сделать.

1 Ответ

4 голосов
/ 26 января 2011

Попробуйте извлечь значения массива через "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(), и никто не будет на терминале сервера нажимать «ок».

...