微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

硬PHP坚果:如何将项目插入一个关联数组?

是的,这是一个棘手的问题;一个数组(没有副本),而不是任何奇数数组.让我解释一下,让我们从这里开始;

$a = array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5, 'six' => 6 ) ;

假装这个阵列很长,超过一百长.我一步一步地循环它,但在某些时候(让我们弥补这发生在第二个项目)会发生一些事情.也许数据很时髦.然而,我们需要添加一些项目以供以后处理,然后继续循环,而不会丢失当前位置.基本上,我想做这样的事情;

echo current ( $a ) ;  // 'two'
array_insert ( $a, 'four', 'new_item', 100 ) ;
echo current ( $a ) ;  // 'two'

array_insert的定义是($array,$key_where_insert_happens,$new_key,$new_value);当然$new_key和$new_value应该包装在一个数组包装器中,但这就是现在的重点.以上是我在上面的代码运行后想要看到的内容;

print_r ( $a ) ; // array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'new_item' => 100, 'five' => 5, 'six' => 6 ) ;
echo current ( $a ) ;  // 'two'

每当你使用array_splice,array_slice,array_push或大多数其他数组fiddling函数时,你基本上都会创建一个数组的副本,然后你可以将它复制回来,但这会破坏对原始数组和位置的引用,并且我上面的循环打破了.我可以使用直接引用(即$a [‘new_item’] =’what;)或将它放在最后,但这些都不会将项插入到给定位置.

任何接受者?如何直接在关联数组中进行真正的插入(在其他地方处理)?到目前为止我唯一的解决方案是;

>记录位置(当前())
>做splice / insert(array_slice)
>用new覆盖旧数组($old = $new)
>搜索新位置(首先重置()然后循环找到它[!!!!!!])

当然,有一种更好,更简单,更优雅的方式来做一些目前笨拙,沉重和拙劣蹒跚的事情?为什么没有可以快速帮助解决的array_set_position($key)函数,或者是直接在同一个数组(或两者)上工作的array_insert?

解决方法:

也许我没有正确理解你,但你有没有看过array_splice()

answer可能也会引起你的兴趣.

会这样的吗?

function array_insert($input, $key, $value)
{
    if (($key = array_search($key, array_keys($input))) !== false)
    {
        return array_splice($input, $key, 1, $value);
    }

    return $input;
}

这是我能想到的最好的:

$a = array
(
    'one' => 1,
    'two' => 2,
    'three' => 3,
    'four' => 4,
    'five' => 5,
    'six' => 6,
);

ph()->Dump(next($a)); // 2
array_insert($a, 'four', array('new_item' => 100));
ph()->Dump(current($a)); // 2

function array_insert(&$array, $key, $data)
{
    $k = key($array);

    if (array_key_exists($key, $array) === true)
    {
        $key = array_search($key, array_keys($array)) + 1;
        $array = array_slice($array, null, $key, true) + $data + array_slice($array, $key, null, true);

        while ($k != key($array))
        {
            next($array);
        }
    }
}

ph()->Dump($a);

/*
Array
(
    [one] => 1
    [two] => 2
    [three] => 3
    [four] => 4
    [new_item] => 100
    [five] => 5
    [six] => 6
)
*/

我不认为可以设置数组内部指针without looping.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐