首页 > 解决方案 > 具有多维数组的array_splice 会中断插入的数组

问题描述

我有以下数组结构:

$tpl = [
    'breadcrumbs' => [
        [ 'title' => 'Item Database', 'text' => 'Item Database', 'url' => SITE_DOMAIN.ADMIN_PATH.'/items/' ],
        [ 'title' => $category->name, 'text' => $category->name, 'active' => true ]
    ]
];

我试图在最后一个元素之前插入一个元素,所以我想我可以使用array_splice如下:

if( !is_null($category->category) )
{
    array_splice(
        $tpl['breadcrumbs'],
        1,
        0,
        [ 'title' => $category->category->name, 'text' => $category->category->name, 'url' => SITE_DOMAIN.ADMIN_PATH.'/items/' ]
    );
}

但是,这似乎使我尝试插入的项目变平(根据预期的行为)并产生以下输出:

Array
(
    [0] => Array
        (
            [title] => Item Database
            [text] => Item Database
            [url] => https://local/qmdepot/admin/items/
        )

    [1] => Medical Department
    [2] => Medical Department
    [3] => https://local/qmdepot/admin/items/
    [4] => Array
        (
            [title] => Class 1
            [text] => Class 1
            [active] => 1
        )

)

虽然预期的输出应该是:

Array
(
    [0] => Array
        (
            [title] => Item Database
            [text] => Item Database
            [url] => https://local/qmdepot/admin/items/
        )
    [1] => Array
        (
            [title] => Medical Department
            [text] => Medical Department
            [url] => https://local/qmdepot/admin/items/
        )
    [2] => Array
        (
            [title] => Class 1
            [text] => Class 1
            [active] => 1
        )
)

我可以使用以下代码来实现这一点,但对我来说感觉有点 hacky:

# Set up the breadcrumbs:
if( !is_null($category->category) )
{
    $tpl['breadcrumbs'][2] = $tpl['breadcrumbs'][1];
    $tpl['breadcrumbs'][1] = [ 'title' => $category->category->name, 'text' => $category->category->name, 'url' => SITE_DOMAIN.ADMIN_PATH.'/items/' ];
}

有没有办法将数组项插入到指定索引处的多维数组中,而无需编写自定义函数或使用上面的 hack?

标签: php

解决方案


由于您要插入的项目是一个数组,并且array_splice需要一个项目数组,因此将您的数组放入一个数组中。

此外,由于您想在最后一个元素之前插入一些东西,您可以使用负数作为偏移量从末尾向后计数。(效果与您获得的数据相同,但对不同大小的数组很重要。)

array_splice(
    $tpl['breadcrumbs'],
    -1,
    0,
    [[ 'title' => $category->category->name, 'text' => $category->category->name, 'url' => SITE_DOMAIN.ADMIN_PATH.'/items/' ]]
);

推荐阅读