3

多次元VARIANT配列(vt_array)を返すCOMオブジェクトを使用していて、配列から値を読み取ろうとしています。

使用するprint_r($mdArray)と表示されますvariant Object。(variant_get_type($mdArray)戻ります8204。)

使用してみforeach ($mdArray as $oneArray)ましたが、次のメッセージが表示されます。

警告:Loader :: getfields()[loader.getfields]:C:\ Inetpub \ wwwroot \ root \ script \ fileloader.phpの135行目の単一次元バリアント配列(この配列には2つあります)のみを処理できます致命的なエラー:キャッチされない例外「例外」とメッセージ「バリアント型のオブジェクトはイテレータを作成しませんでした」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\にスローされます135行目のroot\script \ fileloader.php

(foreachループは135行目にあります)

配列について取得できる唯一の情報は、whichreturnsを使用するcount($mdArray)こと8です。

ここにいる誰かが多次元VARIANT配列からの読み取りの経験がある場合は、これを行う方法を教えてください。

4

1 に答える 1

4

これを試して、「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 の邪悪な結合によって生成された上記のメソッドは、値を 1 つずつ抽出する必要があります。

説明する$y1 = 0; $y2 = 1;と、VBScript 関数のパラメーターは byref であるため、変数以外は何も渡すことができないことに注意してください。

編集:$com->AllowUI = false画面上のポップアップをシャットオフするために追加されました。そうしないと、MsgBox()何らかの方法で VBScript から呼び出され、サーバー ターミナルで [OK] をクリックする人が誰もいなかった場合に、要求がフリーズします。

于 2011-01-26T05:11:00.687 に答える