Несколько лет спустя в настоящее время официально существует лучшее решение. DOM4 Mutation Observers заменяют устаревшие события мутации DOM3. Они , которые в настоящее время реализованы в современных браузерах как MutationObserver
(или как префикс поставщика WebKitMutationObserver
в старых версиях Chrome):
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(function(mutations, observer) {
// fired when a mutation occurs
console.log(mutations, observer);
// ...
});
// define what element should be observed by the observer
// and what types of mutations trigger the callback
observer.observe(document, {
subtree: true,
attributes: true
//...
});
В этом примере прослушивается DOM изменения на document
и все его поддерево, и оно будет срабатывать при изменении атрибутов элемента, а также структурных изменений. Спецификация проекта имеет полный список действительных свойств для прослушивания мутаций :
childList
- Установите значение
true
, если мутации для целей дети должны быть обнаружены.attributes
- Установите на
true
, если необходимо соблюдать мутации для атрибутов цели.characterData
- Установите на
true
, если необходимо наблюдать мутации данных цели.поддерево
- Установите, чтобы
true
, если мутации не просто нацелены, но также должны наблюдаться потомки цели.attributeOldValue
- Установите значение
true
еслиattributes
установлено значение true и значение атрибута цели до того, как необходимо записать мутацию.characterDataOldValue
- Установите значение
true
, еслиcharacterData
установлено значение true и данные цели до того, как необходимо записать мутацию.attributeFilter
blockquote>
- Установить список локальных имен атрибутов (без пространства имен) если не все атрибутные мутации
(Этот список действует с апреля 2014 года; вы можете проверить спецификацию на любые изменения.)
Вы также можете использовать array_column с (из php 5.6) списком аргументов переменной длины :
Например, для изображений, которые содержат массив объектов где каждый объект имеет свойство urls
и содержит массив URL-адресов изображений:
foreach ($prices->groups as $group) {
$groupItem = array();
$groupItem["number"] = $group->number;
$groupItem= array_merge($groupItem, ...array_column($group->images, "urls"));
}
Вне внешнего цикла, введите значение в пустой массив:
$groupItem["urls"] = [];
Затем используйте оператор ссылки на пустой массив, чтобы добавить новые значения в конец массива:
foreach($group->images as $images){
$groupItem["urls"][] = $images->urls; // add this url to the end of the list
}
[ 117] В качестве альтернативы, используйте array_push()
:
foreach($group->images as $images){
array_push($groupItem["urls"], $images->urls);
}
Я думаю, вы, вероятно, также можете пропустить внутренний цикл и просто использовать оператор разнесения массива следующим образом:
array_push($groupItem["urls"], ...$images->urls);