#php #arrays #object
#php #массивы #объект
Вопрос:
Мне нужно изменить свойства объекта (объекта WordPress), и я хотел бы сделать это, используя соответствующий массив значений.
Объект WordPress
array(9) {
["post"]=> object(stdClass)#120 (25) {
["labels"]=> object(stdClass)#123 (12) {
["name"]=> string(5) "Posts"
["singular_name"]=> string(4) "Post"
["add_new"]=> string(7) "Add New"
["add_new_item"]=> string(12) "Add New Post"
["edit_item"]=> string(9) "Edit Post"
["new_item"]=> string(8) "New Post"
["view_item"]=> string(9) "View Post"
["search_items"]=> string(12) "Search Posts"
["not_found"]=> string(15) "No posts found."
["not_found_in_trash"]=> string(24) "No posts found in Trash."
["parent_item_colon"]=> NULL
["menu_name"]=> string(5) "Posts"
}
["description"]=> string(0) ""
["publicly_queryable"]=> bool(true)
["exclude_from_search"]=> bool(false)
["capability_type"]=> string(4) "post"
["map_meta_cap"]=> bool(true)
["_builtin"]=> bool(true)
["_edit_link"]=> string(16) "post.php?post=%d"
["hierarchical"]=> bool(false)
["public"]=> bool(true)
["rewrite"]=> bool(false)
["has_archive"]=> bool(false)
["query_var"]=> bool(false)
["register_meta_box_cb"]=> NULL
["taxonomies"]=> array(0) {
}
["show_ui"]=> bool(true)
["menu_position"]=> NULL
["menu_icon"]=> NULL
["permalink_epmask"]=> int(1)
["can_export"]=> bool(true)
["show_in_nav_menus"]=> bool(true)
["show_in_menu"]=> bool(true)
["name"]=> string(4) "post"
["cap"]=> object(stdClass)#122 (14) {
["edit_post"]=> string(9) "edit_post"
["read_post"]=> string(9) "read_post"
["delete_post"]=> string(11) "delete_post"
["edit_posts"]=> string(10) "edit_posts"
["edit_others_posts"]=> string(17) "edit_others_posts"
["publish_posts"]=> string(13) "publish_posts"
["read_private_posts"]=> string(18) "read_private_posts"
["read"]=> string(4) "read"
["delete_posts"]=> string(12) "delete_posts"
["delete_private_posts"]=> string(20) "delete_private_posts"
["delete_published_posts"]=> string(22) "delete_published_posts"
["delete_others_posts"]=> string(19) "delete_others_posts"
["edit_private_posts"]=> string(18) "edit_private_posts"
["edit_published_posts"]=> string(20) "edit_published_posts"
}
["label"]=> string(5) "Posts"
}
etc...,
etc...,
}
Массив значений, подлежащих изменению
$newpost = array(
'post' => array (
'labels' => array(
'name' => 'News',
'singular_name' => 'News',
'add_new' => 'Add New',
'add_new_item' => 'Add New News',
'edit_item' => 'Edit News',
'new_item' => 'New News',
'view_item' => 'View News',
'search_items' => 'Search News',
'not_found' => 'No news found',
'not_found_in_trash' => 'No news found in Trash',
'parent_item_colon' => '',
'menu_name' => 'News'
),
'menu_icon' => get_bloginfo( 'template_url' ).'/template/cup.png',
)
);
Возможно ли это?
Комментарии:
1. хочет изменить только значения
labels
массива
Ответ №1:
Мне пришло в голову быстрое и грязное решение:
Я использую json_decode и encode, потому что преобразование исходного объекта в массив с помощью (array)$wordpressObject
не преобразует вложенные объекты в массивы
$wordpressArray = json_decode(json_encode($wordpressObject), true);
$modifiedArray = array_merge($wordpressArray, $newpost);
сериализация json снова используется для рекурсивного преобразования между массивом и объектом
$modifiedWordpressObject = json_decode(json_encode($modifiedArray));
Я только что написал пример на codepad
Было бы более чистым решением написать рекурсивный алгоритм для преобразования массивов в объекты, и наоборот, но это первое, что пришло мне в голову.
Комментарии:
1. Я забыл упомянуть, что я использовал json_decode двумя различными способами: передав ему второй параметр ‘true’, функция преобразует json в ассоциативный массив, в то время как его исключение вернет вложенную структуру stdClass (object).
Ответ №2:
Вы могли бы попробовать использовать array_merge(), который объединит второй массив в первый, и любые повторяющиеся значения во втором массиве перезапишут значения в первом массиве.
Комментарии:
1. Опубликованное вами решение почти в порядке, но проблема в том, что перезаписываемая переменная является не массивом, а вложенной объектной структурой stdClass .