¿Cómo se lee de una matriz de variantes multidimensional devuelta de un objeto COM en PHP?
-
22-10-2019 - |
Pregunta
Estoy trabajando con un objeto COM que devuelve una matriz de variantes multidimensional (VT_Array), e estoy tratando de leer los valores de la matriz.
Cuando uso print_r($mdArray)
muestra variant Object
.
(variant_get_type($mdArray)
devoluciones 8204
.)
Intenté usar foreach ($mdArray as $oneArray)
Pero recibo el mensaje:
Advertencia: Loader :: getFields () [loader.getFields]: solo puede manejar matrices de variantes de dimensión única (esta matriz tiene 2) en c: inetpub wwwroot root script fileloader.php en línea 135 Error fatal: excepción sin poder 'Excepción' con mensaje 'Objeto de tipo Variant no creó un iterador' en c: inetpub wwwroot root script fileloader.php: 135 pila traza: #0 c: inetpub wwwroot root script fileloader .php (135): loader :: getFields () #1 c: inetpub wwwroot root testLoader.php (21): loader-> getfields () #2 {main} arrojado en c: inetpub wwwroot root script fileloader.php en la línea 135
(El bucle foreach está en la línea 135)
La única información que puedo obtener sobre la matriz es usar count($mdArray)
que devuelve 8
.
Si alguien aquí tiene alguna experiencia leyendo de matrices de variantes multidimensionales, dígame cómo se puede hacer esto.
Solución
Intente esto para extraer los valores de matriz a través de "VBScript". Sí, lo leiste bien...
<?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";
}
?>
Probado bien en una matriz creada por VBScript, que de lo contrario me dio exactamente los mismos problemas y errores que al tratar de coaccionarlo para que se comporte como una matriz PHP. El método anterior generado por la unión impía de PHP y VBScript debería extraer valores de pieza por pieza bien.
Para explicar $y1 = 0; $y2 = 1;
, tenga en cuenta que los parámetros de la función VBScript son Byref, por lo que no puede pasar nada excepto una variable.
Editar: Adicional $com->AllowUI = false
para apagar cualquier ventana emergente en pantalla. De lo contrario, congelaría la solicitud si un MsgBox()
De alguna manera se llamó desde VBScript y nadie estaba en el terminal del servidor para hacer clic en 'Aceptar'.