PHP - 需要帮助将数组插入给定键的关联数组中

发布于 2024-11-17 05:56:01 字数 8474 浏览 10 评论 0原文

好的,我有一个像这样的数组:

$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'],
    ),
);

现在我希望能够在上面数组中的任何键之前或之后插入一个数组。我想要插入的数组可以如下所示:

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

有人推荐了处理此问题的函数和要使用的方法,但我不确定如何执行此操作,他们也想要这些函数的偏移量。这是有人建议我为此使用的函数结构,而不仅仅是在需要时调用这些函数:

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
}

因此,我希望能够像这样调用函数:

如果需要在指定的键“home”之后执行:

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

如果它需要在指定的键“home”之前:

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

基本上,我真的需要这些功能的帮助,任何帮助都会很棒。

我应该使用 array_splice 还是 array_slice ?有人愿意用一些实际的代码让我朝着正确的方向开始吗?

谢谢大家:)

Ok, so I have an array like so:

$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, either before or after any of the keys within the array above. The array that I want to insert can look like this:

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

Someone recommended functions to handle this and methods to use, but I'm not sure how to do this, they are wanting offsets for these functions also. Here is the function structure that someone recommended I use for this, than just call these functions when needed:

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 the functions like so:

If it needs to go after the key, 'home' that is specified:

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

If it needs to go before the key, 'home' that is specified:

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

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

Should I be using array_splice or array_slice? Would someone be willing to start me off in the right direction here with some actual code please?

Thanks guys :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

成熟稳重的好男人 2024-11-24 05:56:01

这应该可以帮助您开始。注意:我没有测试过这个。它超出了我的想象。

/**
 * 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() 几乎相同,只是 $pos 增加了 1。你应该能够自己弄清楚这一点。

This should get you started. Note: I haven't tested this. It's off the top of my 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() is pretty much the same, except $pos is increased by one. You should be able to figure that out by yourself.

情感失落者 2024-11-24 05:56:01

好吧,在玩了很长一段时间后,我终于让它按照我想要的方式工作了。我使用 $new_menu_buttons 中的某些键来决定要做什么。例如:position 告诉我它是在之后还是之前,parent 告诉我在哪里搜索键,slug 为我提供用于添加的每个新菜单数组的键。 array_splice 不适合我,所以我使用 array_merge 方法,效果非常好。这是为其他遇到此问题的人提供的。

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;
}

感谢你们的帮助:)

Ok, after playing with it for quite some time, I finally got it working the way I want it. I am using certain keys within the $new_menu_buttons to decide on what to do. e.g.: position tells me if it is after or before, parent tells me where to search for the key at, and slug gives me the key to use for each new menu array that gets added. array_splice isn't working for me, so I'm using the array_merge approach instead which works just great. Here it is for anyone else who gets stuck with 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 your help guys :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文