PHP - need help inserting arrays into associative arrays with given keys

Ok, so I have an array like this:

$buttons = array( 'home' => array( 'title' => $txt['home'], 'href' => $scripturl, 'show' => true, 'sub_buttons' => array( ), 'is_last' => $context['right_to_left'], ), 'help' => array( 'title' => $txt['help'], 'href' => $scripturl . '?action=help', 'show' => true, 'sub_buttons' => array( ), ), 'search' => array( 'title' => $txt['search'], 'href' => $scripturl . '?action=search', 'show' => $context['allow_search'], 'sub_buttons' => array( ), ), 'admin' => array( 'title' => $txt['admin'], 'href' => $scripturl . '?action=admin', 'show' => $context['allow_admin'], 'sub_buttons' => array( 'featuresettings' => array( 'title' => $txt['modSettings_title'], 'href' => $scripturl . '?action=admin;area=featuresettings', 'show' => allowedTo('admin_forum'), ), 'packages' => array( 'title' => $txt['package'], 'href' => $scripturl . '?action=admin;area=packages', 'show' => allowedTo('admin_forum'), ), 'errorlog' => array( 'title' => $txt['errlog'], 'href' => $scripturl . '?action=admin;area=logs;sa=errorlog;desc', 'show' => allowedTo('admin_forum') && !empty($modSettings['enableErrorLogging']), ), 'permissions' => array( 'title' => $txt['edit_permissions'], 'href' => $scripturl . '?action=admin;area=permissions', 'show' => allowedTo('manage_permissions'), 'is_last' => true, ), ), ), 'moderate' => array( 'title' => $txt['moderate'], 'href' => $scripturl . '?action=moderate', 'show' => $context['allow_moderation_center'], 'sub_buttons' => array( 'modlog' => array( 'title' => $txt['modlog_view'], 'href' => $scripturl . '?action=moderate;area=modlog', 'show' => !empty($modSettings['modlog_enabled']) && !empty($user_info['mod_cache']) && $user_info['mod_cache']['bq'] != '0=1', ), 'poststopics' => array( 'title' => $txt['mc_unapproved_poststopics'], 'href' => $scripturl . '?action=moderate;area=postmod;sa=posts', 'show' => $modSettings['postmod_active'] && !empty($user_info['mod_cache']['ap']), ), 'attachments' => array( 'title' => $txt['mc_unapproved_attachments'], 'href' => $scripturl . '?action=moderate;area=attachmod;sa=attachments', 'show' => $modSettings['postmod_active'] && !empty($user_info['mod_cache']['ap']), ), 'reports' => array( 'title' => $txt['mc_reported_posts'], 'href' => $scripturl . '?action=moderate;area=reports', 'show' => !empty($user_info['mod_cache']) && $user_info['mod_cache']['bq'] != '0=1', 'is_last' => true, ), ), ), 'profile' => array( 'title' => $txt['profile'], 'href' => $scripturl . '?action=profile', 'show' => $context['allow_edit_profile'], 'sub_buttons' => array( 'summary' => array( 'title' => $txt['summary'], 'href' => $scripturl . '?action=profile', 'show' => true, ), 'account' => array( 'title' => $txt['account'], 'href' => $scripturl . '?action=profile;area=account', 'show' => allowedTo(array('profile_identity_any', 'profile_identity_own', 'manage_membergroups')), ), 'profile' => array( 'title' => $txt['forumprofile'], 'href' => $scripturl . '?action=profile;area=forumprofile', 'show' => allowedTo(array('profile_extra_any', 'profile_extra_own')), 'is_last' => true, ), ), ), 'pm' => array( 'title' => $txt['pm_short'], 'href' => $scripturl . '?action=pm', 'show' => $context['allow_pm'], 'sub_buttons' => array( 'pm_read' => array( 'title' => $txt['pm_menu_read'], 'href' => $scripturl . '?action=pm', 'show' => allowedTo('pm_read'), ), 'pm_send' => array( 'title' => $txt['pm_menu_send'], 'href' => $scripturl . '?action=pm;sa=send', 'show' => allowedTo('pm_send'), 'is_last' => true, ), ), ), 'calendar' => array( 'title' => $txt['calendar'], 'href' => $scripturl . '?action=calendar', 'show' => $context['allow_calendar'], 'sub_buttons' => array( 'view' => array( 'title' => $txt['calendar_menu'], 'href' => $scripturl . '?action=calendar', 'show' => allowedTo('calendar_post'), ), 'post' => array( 'title' => $txt['calendar_post_event'], 'href' => $scripturl . '?action=calendar;sa=post', 'show' => allowedTo('calendar_post'), 'is_last' => true, ), ), ), 'mlist' => array( 'title' => $txt['members_title'], 'href' => $scripturl . '?action=mlist', 'show' => $context['allow_memberlist'], 'sub_buttons' => array( 'mlist_view' => array( 'title' => $txt['mlist_menu_view'], 'href' => $scripturl . '?action=mlist', 'show' => true, ), 'mlist_search' => array( 'title' => $txt['mlist_search'], 'href' => $scripturl . '?action=mlist;sa=search', 'show' => true, 'is_last' => true, ), ), ), 'login' => array( 'title' => $txt['login'], 'href' => $scripturl . '?action=login', 'show' => $user_info['is_guest'], 'sub_buttons' => array( ), ), 'register' => array( 'title' => $txt['register'], 'href' => $scripturl . '?action=register', 'show' => $user_info['is_guest'], 'sub_buttons' => array( ), 'is_last' => !$context['right_to_left'], ), 'logout' => array( 'title' => $txt['logout'], 'href' => $scripturl . '?action=logout;%1$s=%2$s', 'show' => !$user_info['is_guest'], 'sub_buttons' => array( ), 'is_last' => !$context['right_to_left'], ), ); 

Now I want to be able to insert an array into it, before or after any of the keys in the array above. The array I want to insert might look like this:

 $new_menu_buttons['testing'] = array( 'title' => $txt['testing'], 'href' => $scripturl . '?action=testing', 'show' => true, 'target' => '_self', 'active_button' => false, ); 

Some recommended functions to handle this and methods to use, but I'm not sure how to do this, they also want offsets for these functions. Here is the function structure that someone recommended I use for this, and not just call these functions if necessary:

 function array_insert_before($array, $key, $new_array) { // Splice array in two at key, keeping key on the right side // Append new value on the left tail // Glue both arrays into a new array // Return new array } function array_insert_after($array, $key, $new_array) { // Symmetric with right & left switched } 

So, I want to be able to call these functions:

If he needs to go after the key, "home", which is specified:

 $menu_buttons = array_insert_after($buttons, 'home', $new_menu_buttons); 

If he needs to go to the key "home", which is specified:

 $menu_buttons = array_insert_before($buttons, 'home', $new_menu_buttons); 

Basically, I really need help with these features, any help would be great.

Should I use array_splice or array_slice ? Anyone want to start me in the right direction here with some kind of actual code?

Thanks guys:)

+6
source share
2 answers

Well, after a long conversation with him, I finally started working the way I want. I use certain keys in $ new_menu_buttons to decide what to do. For example: position tells me whether it will be after or earlier, the parent tells me where to look for the key, and slug gives me the key to use for each new menu array that is added. array_splice does not work for me, so I use the array_merge approach, which works just fine. Here it is for everyone who is stuck in this problem.

 function array_insert_buttons($buttons, $new_menu_buttons) { foreach($new_menu_buttons as $new) { $keys = array_keys($buttons); $position = (int)array_search($new['parent'], $keys); if ($new['position'] == 'after') $position = $position + 1; // Create the new array in the correct format, using the slug! $new_button = array(); $new_button[$new['slug']] = $new; // Don't need these keys anymore. unset($new_button[$new['slug']]['position']); unset($new_button[$new['slug']]['parent']); unset($new_button[$new['slug']]['slug']); // Putting it all together now. $buttons = array_merge( array_slice($buttons, 0, $position), $new_button, array_slice($buttons, $position) ); } return $buttons; } 

Thanks for helping the guys :)

0
source

This should help you get started. Note. I have not tested this. This is from the head.

 /** * This will insert $new at the beginning if $key is not found */ function array_insert_before($array, $key, $new) { $keys = array_keys($array); $pos = (int) array_search($key, $keys); return array_merge( array_slice($array, 0, $pos), $new, array_slice($array, $pos) ); } 

array_insert_after() almost the same, except $pos incremented by one. You must be able to figure it out on your own.

+5
source

Source: https://habr.com/ru/post/891514/


All Articles