2011-01-26 7 views
3

다차원 VARIANT 배열 (vt_array)을 반환하는 COM 개체로 작업하고 있는데 배열에서 값을 읽으려고합니다.PHP의 COM 객체에서 반환 된 다차원 변형 배열을 읽는 방법은 무엇입니까?

print_r($mdArray)을 사용하면 variant Object이 표시됩니다. (variant_get_type($mdArray) 반환 8204.)

내가 foreach ($mdArray as $oneArray)를 사용하여 시도하지만 난 메시지가 :

Warning: Loader::getfields() [loader.getfields]: Can only handle single dimension variant arrays (this array has 2) in C:\Inetpub\wwwroot\root\script\fileloader.php on line 135 Fatal error: Uncaught exception 'Exception' with message 'Object of type variant did not create an Iterator' in C:\Inetpub\wwwroot\root\script\fileloader.php:135 Stack trace: #0 C:\Inetpub\wwwroot\root\script\fileloader.php(135): Loader::getfields() #1 C:\Inetpub\wwwroot\root\testloader.php(21): Loader->getfields() #2 {main} thrown in C:\Inetpub\wwwroot\root\script\fileloader.php on line 135

(foreach는 루프 라인 135에)

내가 배열에 대해 얻을 수있는 유일한 정보 8을 반환하는 count($mdArray)을 사용합니다.

다차원 VARIANT 어레이에서 읽는 사람이 있다면이 방법을 알려주십시오.

+0

com 객체가 작성된 언어에서 배열의 정확한 클래스/유형을 알고 있습니까? 이미 VB에서 배열을 파싱해야 할 수도 있습니다. 힌트 :'$ vb_control = new COM ("MSScriptControl.ScriptControl");' –

+0

또한 for ($ x = 0; $ x < count ($ mdArray); $ x ++) $ oneArray = $ mdArray [$ x];'대신 루프? –

+0

$ oneArray = $ mdArray [0] 시도한이 전체 메시지와 함께이 메시지가 충돌했습니다 : FastCGI 오류 FastCGI 처리기가 요청을 처리 할 수 ​​없습니다. 오류 정보 : * FastCGI 프로세스가 예기치 않게 종료했습니다. * 오류 번호 : -2147467259 (0x80004005). * 오류 설명 : 알 수없는 오류 HTTP 오류 500 - 서버 오류. 인터넷 정보 서비스 (IIS) – john

답변

4

"VBScript"를 통해 배열 값을 추출해보십시오. 예, 당신은 PHP 배열처럼 행동하기를 강요 할 때, 그렇지 않으면 당신 같은 날 동일한 문제와 오류를 준 바로 ... 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"; 
    } 

?> 

을 읽어 보시기 바랍니다. 위의 방법은 PHP와 VBscript의 보잘것없는 조합에 의해 생성 된 값으로 조각을 잘 추출해야합니다.

$y1 = 0; $y2 = 1;을 설명하기 위해 VBScript 함수의 매개 변수는 byref이므로 변수를 제외하고는 아무 것도 전달할 수 없습니다.

편집 : 화면 팝업을 차단하려면 $com->AllowUI = false이 추가되었습니다. 그렇지 않으면 MsgBox()이 어떻게 든 VBScript에서 호출되었고 아무도 서버 터미널에서 '확인'을 클릭하지 않으면 요청이 고정됩니다.

+0

그것은 훌륭합니다! 정말 고맙습니다! 이 코드는 훌륭하게 작동했습니다. (나는 당신의 대답을 upvote에 대한 명성이 충분하지 않지만, 정말로 고맙습니다.) COM 객체에 보낼 다차원 배열을 만들 수 있도록이 스크립트를 뒤집을 수 있습니까? – john

+1

감사! 불행히도, 역으로 갈 때 같은 문제가 발생합니다. 그러나 VBScript에서이 루프를 반복 할 수는 있습니다.내가 생각할 수있는 유일한 것은 VBScript 함수를 1) PHP 다차원 배열로 가져 오는 것, 2) 완전히 새로운 유효 배열을 구축하는 중첩 된 foreach 루프를 사용하는 것, 3) PHP로 반환하여 COM으로 반환하는 것 목적. –

+0

@ bob-the-destroyer 당신의 대답은이 유형의 시나리오에 대해 어떻게 생각하는지에 대한 아이디어를주었습니다. var (@ myArrayObject); var_dump ($ myArrayObject);를 실행할 때 PHP에서 COM 객체가 객체 (variant) # 3 (0) {}을 반환합니다. 이걸 내가 어떻게 처리 할까? –