Некоторые другие решения, опубликованные здесь, не могут отличить последовательные массивы (что будет []
в JS) от карт ({}
в JS.) Для многих случаев использования важно отличать PHP-массивы, которые имеют всепоследовательные числовые ключи, которые следует оставить как таковые, из массивов PHP, которые не имеют числовых ключей, которые должны быть преобразованы в объекты.(Мои решения ниже не определены для массивов, которые не попадают в две вышеупомянутые категории.)
Метод json_decode(json_encode($x))
действительно обрабатывает два типа правильно, но это не самое быстрое решение.Тем не менее, он по-прежнему приличный, составляя 25 мкс за прогон для моих выборочных данных (в среднем за 1M прогонов, минус накладные расходы цикла).со следующим.Он перестраивает все массивы и объекты (выполняет глубокое копирование), но, похоже, работает быстрее, чем альтернативные решения, которые модифицируют существующие массивы.Он показывает 11 мкс за исполнение на моих образцах данных:
function array_to_object($x) {
if (!is_array($x)) {
return $x;
} elseif (is_numeric(key($x))) {
return array_map(__FUNCTION__, $x);
} else {
return (object) array_map(__FUNCTION__, $x);
}
}
Вот версия на месте.Это может быть быстрее для некоторых больших входных данных, где нужно преобразовать только небольшие части, но в моих выборочных данных это заняло 15 мкс за выполнение:
function array_to_object_inplace(&$x) {
if (!is_array($x)) {
return;
}
array_walk($x, __FUNCTION__);
reset($x);
if (!is_numeric(key($x))) {
$x = (object) $x;
}
}
Я не пробовал решенияиспользуя array_walk_recursive()