Comment lisez-vous d'un tableau multidimensionnel variant de retour d'un objet COM en PHP?
-
22-10-2019 - |
Question
Je travaille avec un objet COM qui renvoie un tableau de VARIANT (Multidimensional VT_ARRAY), et je suis en train de lire les valeurs du tableau.
Quand j'utilise print_r($mdArray)
il affiche variant Object
.
(Retourne variant_get_type($mdArray)
8204
.)
J'ai essayé d'utiliser foreach ($mdArray as $oneArray)
mais je reçois le message:
Avertissement: Chargeur :: getfields () [loader.getfields]: Ne peut poignée matrices de dimension variant unique (ce tableau a 2) C: \ Inetpub \ wwwroot \ root \ scripts \ fileloader.php sur la ligne 135 Fatal error: Uncaught exception 'Exception' avec le message « Objet de la variante de type n'a pas créé dans « un itérateur C: \ Inetpub \ wwwroot \ root \ scripts \ fileloader.php: 135 Trace de la pile: # 0 C: \ Inetpub \ wwwroot \ root \ scripts \ fileloader.php (135): Chargeur :: getfields () # 1 C: \ Inetpub \ wwwroot \ root \ testloader.php (21): Loader-> getfields () # 2 {main} jeté dans C: \ Inetpub \ wwwroot \ root \ scripts \ fileloader.php sur la ligne 135
(La boucle foreach est sur la ligne 135)
La seule information que je peux obtenir sur le tableau est à l'aide count($mdArray)
qui retourne 8
.
Si quelqu'un a ici une expérience de lecture de tableaux VARIANT multidimensionnels me dire comment cela peut se faire.
La solution
Essayez ceci pour extraire des valeurs de tableau par « VBScript ». Oui, vous avez bien lu ...
<?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";
}
?>
bonne Testé sur un tableau créé VBScript, qui, autrement, m'a donné les problèmes exactement les mêmes erreurs et que vous en essayant de le contraindre à se comporter comme un tableau PHP. La méthode ci-dessus donné naissance par l'union contre nature de PHP et VBscript doit extraire des valeurs morceau par morceau très bien.
Pour expliquer $y1 = 0; $y2 = 1;
, garder à l'esprit les paramètres de la fonction VBScript sont byref, de sorte que vous ne pouvez pas passer quoi que ce soit à l'exception d'une variable.
Modifier: Ajout $com->AllowUI = false
pour fermer toutes les fenêtres pop-up à l'écran. Dans le cas contraire, il gèlerait la demande si un MsgBox()
en quelque sorte été appelé à partir de VBScript et personne ne se trouvait au terminal serveur de cliquer sur « ok ».