2013-11-07 1 views
35

я получаю массив ошибки преобразования строки следующую строку:Почему array_diff() дает Array ошибку строковой конверсии?

$diff = array_diff($stockist, $arr); 

Здесь $arr массив декодируется из файла JSON. Используя функцию is_array(), я смог проверить, что оба параметра являются массивами. Может кто-то момент мне проблему

$stockist = array(); 
while (!feof($file_handle)) { 

    $line_of_text = fgetcsv($file_handle); 
    $query = "SELECT * FROM reorderchart WHERE medicine = '" 
     . trim($line_of_text[3]) 
     . "' ORDER BY medicine"; 
    $result = mysql_query($query); 

    if (trim($line_of_text[2]) - trim($line_of_text[1]) <= 0) { 

     while ($row = mysql_fetch_array($result)) { 

      $file = "results.json"; 
      $arr = json_decode(file_get_contents($file),true); 
      $pharmacy = trim($row['Medicine']); 

      if (isset($stockist[$pharmacy])) { 

       $medicine = $stockist[$pharmacy]; 
       $medicine[] = trim($row['Stockist']); 
       $stockist[$pharmacy] = $medicine; 

      } else { 

       $medicine = array(); 
       $medicine[] = trim($row['Stockist']); 
       $stockist[$pharmacy] = $medicine; 
      } 
     } 
    } 
} 
$diff = array(); 
$diff = array_diff_assoc($stockist,$arr); 
ksort($diff); 
foreach ($diff as $key => $value) { 

    echo "<table align='center' border='1'>"; 
    echo "<tr><td align = 'center'> <font color = 'blue'> $key</td></tr>"; 

    foreach($value as $key1 => $value1) { 

     echo "<tr><td align ='center'>$value1</td></tr><br>"; 
    } 
    echo "</table>"; 
} 
+2

Покажите нам свой код – TiMESPLiNTER

+1

Возможная причина: многомерные массивы –

+0

_ «оба параметра являются массивами» _ Уверены, что они есть, а php ничего не говорит. Проблема заключается в _array для преобразования строк, а не наоборот. Вопрос в том, что делают эти массивы _. – geomagas

ответ

6

Согласно PHP документации для функции

Примечание: Два элемента считаются равными, если и только если (строка) $ elem1 === (строка) $ elem2. В словах: когда строковое представление одно и то же.

Для получения дополнительной информации обратитесь к http://php.net/manual/en/function.array-diff.php

+0

Мне нужно только сравнить ключи. Поэтому я использовал array_diff_key(). Но он возвращает нулевой массив. – user2963765

+0

Если он возвращает пустой массив, это означает, что оба массива имеют один и тот же набор ключей. – max

20

В соответствии с этим:

php -r 'array_diff(array("a" => array("b" => 4)), array(1));' 
PHP Notice: Array to string conversion in Command line code on line 1 
PHP Stack trace: 
PHP 1. {main}() Command line code:0 
PHP 2. array_diff() Command line code:1 

Один из ваших массивов многомерна.

array_diff проверяет только одно измерение n-мерного массива. Конечно, вы можете проверить более глубокие измерения, используя array_diff($array1[0], $array2[0]);

1

Я получил ту же ошибку и нашел следующее сообщение об ошибке для PHP:

https://bugs.php.net/bug.php?id=60198

Некоторые из array_ * функции, сравнивающие элементы в нескольких массивах это так (строка) $ elem1 === (string) $ elem2.

Если $ elem1 или $ elem2 - это массив, тогда массив для уведомления строки - .

Два примера функций, которые могут вызвать это, - array_intersect() и array_diff().

Если эти функции не должны принимать массивы с другими массивами в качестве значений, это следует упомянуть на страницах документации.

В этом отчете описывается, почему php вызывает ошибку при сравнении многомерного массива.

9

Да, строгий ответ объясняется тем, что «один из ваших массивов является многомерным."

Еще одна полезная заметка может быть - в зависимости от ваших потребностей дальнейшего разбора реальных различий - рассмотреть первые тестирования ваших массивов с:

$diff = strcmp(json_encode($stockist), json_encode($arr)); 

или

$diff = strspn(json_encode($stockist)^json_encode($arr), "\0"); 

или

$diff = xdiff_string_diff(json_encode($stockist), json_encode($arr)); 

Все эти варианты будут сравнивать все дерево массива, а не только верхний уровень.

7

С array_diff может дело только с одним измерением, вы можете:

  • конвертировать мульти-мерного массива в одном измерении, например, по:

    • flattening a multidimensional array и т.д .:

      while ($arr) { 
          list($key, $value) = each($arr); 
          is_array($value) ? $arr = $value : $out[$key] = $value; 
          unset($arr[$key]); 
      } 
      // Now $out is flatten version of $arr. 
      
    • serializing the array и т.д .:

      $results = array_diff(array_map('serialize',$a2), array_map('serialize',$a1)); 
      
  • использовать пользовательские recursive array_diff-like function,

+0

Сглаживание многомерного массива неверно. Когда приближается первый вложенный массив, функция забывает все остальные значения в исходном $ arr. – Kangur

 Смежные вопросы

  • Нет связанных вопросов^_^