Come si può leggere da un array multidimensionale variante tornato da un oggetto COM in PHP?
-
22-10-2019 - |
Domanda
Sto lavorando con un oggetto COM che restituisce un array multidimensionale VARIANT (VT_ARRAY), e sto cercando di leggere i valori dalla matrice.
Quando uso print_r($mdArray)
visualizza variant Object
.
(Rendimenti variant_get_type($mdArray)
8204
.)
Ho provato ad utilizzare foreach ($mdArray as $oneArray)
ma ricevo il seguente messaggio:
Attenzione: Loader :: getfields () [loader.getfields]: può solo manico Array monodimensionale variante (questo array ha 2) in C: \ Inetpub \ wwwroot \ root \ sceneggiatura \ fileloader.php on line 135 Fatal error: Uncaught eccezione 'Eccezione' con il messaggio 'Oggetto di tipo variante non ha creato in un Iterator' C: \ Inetpub \ wwwroot \ root \ sceneggiatura \ fileloader.php: 135 Analisi dello stack: # 0 C: \ Inetpub \ wwwroot \ root \ sceneggiatura \ fileloader.php (135): Loader :: getfields () # 1 C: \ Inetpub \ wwwroot \ root \ testloader.php (21): Loader-> getfields () # 2 {main} gettato nel C: \ Inetpub \ wwwroot \ root \ sceneggiatura \ fileloader.php on line 135
(Il ciclo foreach è on line 135)
L'unica informazione che posso ottenere circa la matrice è quello di utilizzare count($mdArray)
che restituisce 8
.
Se qualcuno qui ha alcuna esperienza di lettura da array multidimensionali VARIANT prego di dirmi come questo può essere fatto.
Soluzione
Prova questo per estrarre i valori di matrice attraverso la "VBScript". Sì, avete letto bene ...
<?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";
}
?>
buona Testato su un array di VBScript creato, che altrimenti mi ha dato gli stessi problemi e gli errori esatte come quando si cerca di costringerlo a comportarsi come un array PHP. Il metodo di cui sopra generato dall'unione empia di PHP e VBScript deve estrarre i valori pezzo per pezzo più che bene.
Per spiegare $y1 = 0; $y2 = 1;
, tenere a mente i parametri della funzione VBScript sono byref, quindi non si può passare nulla a eccezione di una variabile.
Modifica Aggiunto $com->AllowUI = false
per spegnere eventuali popup sullo schermo. Altrimenti sarebbe congelare la richiesta se un MsgBox()
in qualche modo stato chiamato da VBScript e nessuno era al terminal server per fare clic su 'OK'.