PHPのCOMオブジェクトから返された多次元バリアントアレイからどのように読みますか?
-
22-10-2019 - |
質問
多次元バリアント配列(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でC: inetpub wwwroot root script fileloader.phpで単一のディメンションバリアント配列(この配列が2)のみを処理できます。型バリアントのメッセージを使用した「例外」は、c: inetpub wwwroot root script fileloader.phpでc: inetpub wwwroot root fileloader.phpでiteratorを作成しませんでした。 .php(135):ローダー:: getFields()#1 C: inetPub wwwroot root testloader.php(21):loader-> getfields()#2 {main}がc: inetpub wwwroot で投げられますroot script fileloader.php on 135
(foreachループは135行目にあります)
配列について取得できる唯一の情報は、 count($mdArray)
戻ります 8
.
ここの誰かが多次元バリアントアレイから読んだ経験がある場合は、これがどのようにできるか教えてください。
解決
これを試して、「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
画面上のポップアップを遮断します。それ以外の場合は、aの場合、リクエストをフリーズします MsgBox()
どういうわけかvbscriptから呼び出され、「OK」をクリックするためにサーバー端末に誰もいませんでした。