stackoverflow.com/questions/42166123/...

отаю с 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 \ 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, пожалуйста, скажите мне, как это можно сделать.

 john26 янв. 2011 г., 04:28
Я попытался $ oneArray = $ mdArray [0], и весь скрипт потерпел крах с этим сообщением: Ошибка FastCGI Обработчику FastCGI не удалось обработать запрос. Сведения об ошибке: * Процесс FastCGI неожиданно завершился * Номер ошибки: -2147467259 (0x80004005). * Описание ошибки: неопределенная ошибка HTTP Error 500 - Ошибка сервера. Информационные службы Интернета (IIS)
 john26 янв. 2011 г., 04:30
Единственное, что я знаю об этом, это то, что это многомерный массив, и каждый отдельный массив содержит 2 строки. Я не знаю, как массив был реализован или класс / тип, используемый для создания массива. Я новичок в этой работе и пытаюсь использовать COM-объект, который был запрограммирован кем-то, кто покинул компанию, и с кем я не могу связаться.
 bob-the-destroyer26 янв. 2011 г., 03:49
Вы знаете точный класс / тип массива на каком языке написан объект com? Я уже боюсь, что вам, возможно, придется попробовать разобрать массив в VB ... Подсказка:$vb_control = new COM("MSScriptControl.ScriptControl");
 bob-the-destroyer26 янв. 2011 г., 03:57
также вы пробовалиfor ($x=0; $x < count($mdArray); $x++) $oneArray = $mdArray[$x]; цикл вместо?

Ответы на вопрос(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->AllowUI = false чтобы отключить любые всплывающие окна на экране. В противном случае запрос будет заблокирован, еслиMsgBox() как-то вызвали из VBScript, и никто не был на терминале сервера, чтобы нажать «ок».

 Joseph Muithi10 февр. 2017 г., 19:35
@ bob-the-destroyer не могли бы вы помочь мне с этим вопросом здесьstackoverflow.com/questions/42166123/...
 Joseph Muithi10 февр. 2017 г., 18:04
@ bob-the-destroyer ваш ответ дал мне представление о сценарии такого типа. У меня есть объект COM в Php, возвращающий объект (вариант) # 3 (0) {}, когда я выдаю var_dump ($ myArrayObject); как бы я справился с этим?
 john26 янв. 2011 г., 06:50
Это блестяще! Спасибо вам большое! Этот код работал отлично. (У меня недостаточно репутации, чтобы поднять ваш ответ, но я действительно ценю его.) Можно ли отменить этот сценарий, чтобы я мог создавать многомерные массивы для отправки в COM-объект?
 bob-the-destroyer26 янв. 2011 г., 08:00
Спасибо! К сожалению, вы сталкиваетесь с той же проблемой при движении задним ходом. Тем не менее, вы можете развернуть его в VBScript. Единственное, о чем я могу думать, это заставить функцию VBScript: 1) взять многомерный массив PHP, 2) использовать над ним вложенные циклы foreach, создавая совершенно новый действительный массив, 3) вернуть его в PHP, чтобы затем вернуть его в COM объект.

Ваш ответ на вопрос