Унифицируйте переменные типы элементов массива - PullRequest
1 голос
/ 20 октября 2010

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

Поэтому у меня в основном есть некоторый код, такой как

$key = md5(json_encode($data));

генерировать уникальный ключ для каждого события.

Теперь в некоторых случаях значение в массиве $data является целым числом, иногда строкой (в зависимости от того, откуда оно взято - база данных или URL).Это приводит к тому, что выходные данные json_encode() отличаются друг от друга - один раз, включая кавычки, один раз нет.

Кто-нибудь знает способ "унифицировать" типы переменных в массиве $data?Это, вероятно, означало бы преобразование всех строк, которые содержат только целочисленное значение, в целое число.Что еще мне нужно позаботиться при использовании json_encode()?

1 Ответ

2 голосов
/ 20 октября 2010

array_walk_recursive в сочетании с функцией, которую вы написали с эффектом maybe_intval, которая выполняет преобразование, о котором вы говорите, для одного элемента.

РЕДАКТИРОВАТЬ: прочитав документацию для array_walk_recursive более внимательно, вы действительно захотите написать свою собственную рекурсивную функцию

function to_json($obj){
  if(is_object($obj))
    $obj=(array)$obj;
  if(is_array($obj))
    return array_map('to_json',$obj);
  return "$obj"; // or return is_int($obj)?intval($obj):$obj; 
}
...