2010-06-14 2 views
0

2 다차원 PHP 배열 간의 차이점을 출력하는 재귀 함수를 작성하고 있습니다. 이 코드의 목적은 adobe bridge cs3이 jpg 파일에서 등급 정보를 저장하는 방법을 결정하기 위해 jpeg 헤더 간의 차이를 확인하는 것입니다.PHP ifif 문은 초기 if 문이 거짓 일지라도 실행되지 않습니다.

내 eclipse-zend 디버거 ide를 사용하여 코드를 한 단계 씩 실행할 때 초기 if 문이 false (즉, 값이 배열이 아님)인데도 후속 elseif 문은 실행되지 않습니다. 이 기능은 아래에 첨부되어 있습니다.

참고 : 의견
에 따라 원래의 게시물 이후의 변경은 기본 수준 = ''는 다른 제거됨} {경우 ELSEIF {} 블록
사이
제거 주석을 추가; 한 블록의 끝에서 각도 브래킷이 정확하게 귀하의 질문에 대답하지 않습니다

 
function array_diff_multi($array1,$array2,$level=''){ 
    $keys = array_keys($array1); 
    foreach($keys as $key) 
    { 
    $value1 = $array1[$key]; 
    if(array_key_exists($key,$array2)){ 
     $value2 = $array2[$key]; 

     if (is_array($value1) && is_array($value2)){  // Check if they are both arrays, if so recursion is needed 
     array_diff_multi($value1,$value2,$level . "[ " . $key . " ]"); 
     } 
     elseif(is_array($value1) != is_array($value2)){ // Recursion is not needed, check if comparing an array to another type 
     print "<br>" . $level . $key ."=>" . $value1 . "as array, compared to ". $value2 ."<br>"; 
     } 
     elseif($value1 != $value2){      // the values don't match, print difference 
     print "<br>" . $level . $key ."=>" . $value1 ." != " . $value2 ."<br>"; 
     } 
    } 
    else{            
     print "<br>" . $level. $key . "does not exist in array2"; 
    } 
    } 
} 
+0

'$ array1'과'$ array2'에 사용하는 샘플을 줄 수 있습니까? – thetaiko

+2

어쩌면 misspoke - value1과 value2가 모두 배열 인 경우 첫 번째 if 문은 true로 평가되고 elseifs는 무시됩니다. 한 값이 배열이고 다른 값이 그렇지 않으면 첫 번째 elseif가 트리거되어야합니다. 또한 (나는) is_array가 true/false를 반환 할 것이므로 "! =="대신 "! =="를 사용하는 것이 좋습니다. –

+0

무엇이 실행됩니까? –

답변

0

에 그것을 켜십시오. 나는 (레벨 매개 변수 '의 기본 값을 추가하는 작은 차이) 함수를 넣어,이 두 배열 :

$a1 = array('foo', 'bar', 2, array('baz', '3', 4, array(54,45))); 
$a2 = array('faz', 'bar', 4, array('buz', '3', 5, 54)); 

그리고이 출력을 가지고 :

0=>foo != faz 

2=>2 != 4 

[ 3 ]0=>baz != buz 

[ 3 ]2=>4 != 5 

[ 3 ]3=>Arrayas array, compared to 54 
아마도

당신의 시작을 배열은 당신이 생각하는 그런 것이 아닙니다 ...?

+0

기본값을 추가하는 것이 좋습니다. 내 코드를 단계별로 실행하면 $ array1 변수는 두 번째 수준이 아닌 ORIGINAL 배열을 계속 보여줍니다. 값으로 배열을 전달하려면 PHP에서 다른 작업을 수행해야합니까? – DarwinIcesurfer

+0

어? '$ level'은 다음 단계를 나타내지 만 $ array1은 그대로 유지됩니까? 그렇게해서는 안됩니다. 위에 적힌 코드가 정확히 무엇을 가지고 있습니까? 그렇다면 디버거를 사용하지 않도록 설정하십시오 ... 게시하지 않은 코드가 실제로 작동하기 때문에 정확한 코드로 업데이트하십시오. – ircmaxell

+0

디버거가 이상하게 작동하고있었습니다. 나는 종료하고 이클립스를 다시 시작했다. 이제는 내 코드가 제대로 작동하는 것으로 보입니다. 그러나 비교할 배열 사이에는 차이가 없습니다! – DarwinIcesurfer

0

내 코드에 표시 할 수 있도록 어떤 기능 는 < 및 > 문자 인코딩,하지만 난 어도비 브릿지는 dotfiles에 메타 데이터를 저장 생각 파일과 같은 디렉토리에 있습니다. 예를 들어, 정렬 정보는 .bridgesort 파일에 저장됩니다.

+0

팁 주셔서 감사합니다. 어떻게 든 jpg를 복사 할 때 도트 파일을 새 디렉토리에 복사하지 않더라도 브리지에서 만든 등급은 VISTA에서 볼 수 있습니다. – DarwinIcesurfer

0

elseif 모두가 건너 뛸 수있는 유일한 방법은 두 변수가 배열이 아니고 동일한 경우입니다. 당신이 마지막에

else; 

을 가지고 있기 때문에

+0

첫 번째 elseif에도 도달하지 못하는 것이 이상하다는 것을 알게되었습니다. 재귀 때문에 이상한 행동을 일으키는 것이 있습니까? 첫 번째 if 문 내부의 문을 강조 표시하면 결과가 false (배열이 아님)이지만 후속 elseif에 도달하지 않은 것으로 표시됩니다. – DarwinIcesurfer

+1

그러나 둘 다 배열이 아니면 두 번째 'elseif'는 거짓입니다. –

+0

대신에'&&'를'&&'로 사용하셨습니까? –

2

이 될 수 ...?

그것은 여기에 나를 위해 잘 작동이 제거 또는 '실제 코드'

+0

나는 else를 제거했다; 선. 이 함수는 여전히 같은 방식으로 작동합니다. 이 문제는 재귀 함수가 첫 번째 배열, 즉 item1 [0] [n]과 item2 [0] [n]의 비교를 시작한 후에 발생합니다. 여기서 두 값은 모두 정수입니다. – DarwinIcesurfer

관련 문제