Оператор PHP elseif не выполняется, даже если исходный оператор false - PullRequest
0 голосов
/ 15 июня 2010

Я пишу рекурсивную функцию для распечатки различий между двумя многомерными массивами php.Цель этого кода - увидеть разницу между заголовками jpeg, чтобы определить, как Adobe Bridge CS3 сохраняет информацию о рейтинге в файле jpg.

Когда я пошагово выполняю код, используя мой eclipse - zend debugger ideПохоже, что даже если исходный оператор if является ложным (т. е. ни одно из значений не является массивом), последующие операторы elseif никогда не выполняются.Функция прикреплена ниже.

Примечание: Изменения по сравнению с оригинальным сообщением на основе комментариев
Добавлен уровень по умолчанию = ''
Удалены комментарии между блоками if {} 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";
    }
  }
}

Ответы [ 4 ]

2 голосов
/ 15 июня 2010

это может быть потому, что у вас есть

else;

в конце ...?

Попробуйте удалить это или превратить это в "реальный код"

0 голосов
/ 15 июня 2010

Здесь у меня хорошо работает. Я поместил вашу функцию (с небольшой разницей в добавлении значения по умолчанию '' к параметру уровня), и эти два массива:

$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 голосов
/ 15 июня 2010

Единственный способ пропустить все elseif s - это если две переменные не являются массивами и равны.

0 голосов
/ 15 июня 2010

Это не совсем отвечает на ваш вопрос, но я думаю, что Adobe Bridge сохраняет метаданные в точечных файлах в том же каталоге, что и файлы.Например, информация о сортировке сохраняется в файле .bridgesort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...