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.

È stato utile?

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'.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top