Мое тестирование должно было быть простым, потому что я не собираюсь тратить время на перевод любого предоставленного вами дампа в рабочий массив; если это не работает, предоставьте var_export
массива для тестирования.
Это, однако, звучит как работа для array_walk_recursive()
.
$coll = array();
function array_get_keys($value, $key, $c) {
if (strcasecmp($key,'object_id')==0) {
array_push($c[0],$value);
}
}
array_walk_recursive($array, 'array_get_keys', array(&$coll));
Последний параметр array_walk_recursive
является ссылкой в массиве, потому что, поскольку передача по времени вызова устарела, это единственный способ (, отличный от некоторой замысловатой структуры объекта См. Ниже ), чтобы передать ссылку на контейнер в функцию обработчика.
Этот код должен заполнить $coll
всеми значениями, в качестве ключа которых указан 'object_id'. Это не будет работать в случаях, когда 'object_id' является массивом, потому что это известное поведение array_walk_recursive()
(то есть функция обратного вызова не инициируется для элементов, которые сами являются массивами).
РЕДАКТИРОВАТЬ (для великого правосудия):
Структура объекта на самом деле не такая запутанная, поэтому, если вы хотите избежать посторонних массивов / ссылочных конструкций, вот как это сделать:
$coll = new ArrayObject;
function array_get_keys($value, $key, $c) {
if (strcasecmp($key,'object_id')==0) {
$c[] = $value;
}
}
array_walk_recursive($array, 'array_get_keys', $coll);
Как это работает
Функция PHP array_walk_recursive()
принимает заданный массив в качестве первого параметра и выполняет итерацию по каждой паре ключ / значение. Если значение является скалярным, оно передает комбинацию ключ / значение некоторой пользовательской функции обратного вызова; однако, если значение является массивом, array_walk_recursive()
будет рекурсивно вызывать себя и продолжать вести себя таким же образом. Он будет работать таким образом до тех пор, пока не пройдет через все элементы массива.
Второй параметр - это функция обратного вызова для использования; в этом случае я написал и объявил функцию (array_get_keys
) и передал ее имя в виде строки во втором параметре. Таким образом, функция зарегистрирована array_walk_recursive()
и является функцией, выполняемой каждый раз, когда обрабатывается пара ключ / значение.
Третий параметр в обоих примерах - это, по сути, часть «дополнительных» данных, которые мы можем передать нашей функции обратного вызова, чтобы изменить ее поведение - в этом случае это массив (или во втором примере контейнер ArrayObject) который (а) определен в глобальной области и (б) используется для хранения всех значений, для которых $key == 'object_id'
имеет значение true.
В первом примере я использую синтаксис array(&$coll)
для передачи переменной коллекции, потому что это единственный способ передать ссылку на коллекцию, чтобы ее можно было изменить в глобальной области видимости (в противном случае у нас нет способ получения списка). Во втором примере я объявляю $coll
как ArrayObject
, что делает его неявно передаваемым по ссылке, поэтому нет необходимости содержать его в массиве, чтобы гарантировать его изменение в глобальной области.