php 如何更新数组,并限制十一个元素

xuweijia90324 发布于 2016/05/26 14:58
阅读 487
收藏 0
PHP

如何更新一个数组,并保证这个数组里一直是11个元素,每次更新要把前几个给顶替掉,相应的后几个踢出

例如:原数组:array('a'=>'aaa','b'=>'bbb','c'=>'ccc','d'=>'ddd')

        更新的数组:array('cat'=>'blue','dog'=>'yellow','a'=>'aaa','b'=>'bbb')

求解答

加载中
1
inuxor
inuxor

玩php嘛,就别想着自己对数组实现什么底层玩法了。玩玩可以,真干活应该这个思路

<?php

$input = ['a' => 'aaa', 'b' => 'bbb', 'c' => 'ccc', 'd' => 'ddd',];
$add = ['cat'=>'blue','dog'=>'yellow',];
$output = array_merge($add, array_slice($input, 0, -2));
var_dump($output);






xuweijia90324
xuweijia90324
简单高效
wintercode
wintercode
这种实现好
0
bodii
bodii
$a = array('a'=>'aaa','b'=>'bbb','c'=>'ccc','d'=>'ddd');
        $b = array('cat'=>'blue','dog'=>'yellow',4,3,65,5,40,11,2,66,15,34,235,667);
        $a_count = count($a);
        $b_count = count($b);
        if($b_count > 11){
            $b = array_slice($b, 0, 10);
        }
        if($a_count > 11){
            $a  = array_slice($a, 0, 10);
        }
        $new_arr = array();
        foreach ($b as $k => $v) {
            $new_arr[$k] = $v;
        }
        for ($i = 0; $i < count($b); $i++) {
            array_pop($a);
        }
        foreach ($a as $k => $v) {
            $new_arr[$k] = $v;
        }

        $a = $new_arr;
        var_dump($a);



xuweijia90324
xuweijia90324
后两个符合,但我已经写出来了,但还是谢谢~~~
xuweijia90324
xuweijia90324
说的很清楚,把前几个顶替掉,相应的后几个踢出
bodii
bodii
回复 @xuweijia90324 : 你是要拿$a的内容更新追加到$b前啊,嗨,问题阐明的不清楚,$a是更新者,$b是被更新者吧
xuweijia90324
xuweijia90324
b 数组前几个没有更新,后面的倒是踢出了,不符合要求啊
0
bodii
bodii

那就更简单了:

$a = array('a'=>'aaa','b'=>'bbb','c'=>'ccc','d'=>'ddd');
        $b = array('cat'=>'blue','dog'=>'yellow',4,3,65,5,40,11,2,66,15,34,235,667);
        $new_arr = array();
        foreach ($a as $k => $v) {
            $new_arr[$k] = $v;
        }
        foreach ($b as $k => $v) {
            $new_arr[$k] = $v;
        }
        $new_arr = array_slice($new_arr, 0, 11);
        var_dump($new_arr);
0
bodii
bodii
或是
        $a = array('a'=>'aaa','b'=>'bbb','c'=>'ccc','d'=>'ddd');
        $b = array('cat'=>'blue','dog'=>'yellow',4,3,65,5,40,11,2,66,15,34,235,667);
        $new_arr = array_merge($a,$b);
        $new_arr = array_slice($new_arr, 0, 11);
        var_dump($new_arr);



wintercode
wintercode
不错不错学习了~
0
西南茂
西南茂

http://php.net/manual/zh/class.splfixedarray.php

实现上述接口,再自己实现一个方法,push方法用于向数组中添加元素,总是加在数组头部,并将元素后移,丢弃超过长度的部分。

0
西南茂
西南茂
<?php
class MyArray extends SplFixedArray{
    public function push($value){
        for($i = $this->getSize()-1; $i >=1; $i--){
            $this[$i] = $this[$i-1];
        }
        $this[0] = $value;
    }
}

$arr = new MyArray(11);

for($i = 0; $i < 11; $i++){
    $arr->push($i);
}

var_dump($arr);

// object(MyArray)#1 (11) { [0]=> int(10) [1]=> int(9) [2]=> int(8) [3]=> int(7) [4]=> int(6) [5]=> int(5) [6]=> int(4) [7]=> int(3) [8]=> int(2) [9]=> int(1) [10]=> int(0) } 

$arr->push('我就是来测试的');

var_dump($arr);

// object(MyArray)#1 (11) { [0]=> string(21) "我就是来测试的" [1]=> int(10) [2]=> int(9) [3]=> int(8) [4]=> int(7) [5]=> int(6) [6]=> int(5) [7]=> int(4) [8]=> int(3) [9]=> int(2) [10]=> int(1) }

写了段代码来测试,亲测可用。


0
方棱
方棱
把key为a的数据改成key为b(已存在)时,预期结果是啥?  —— 阴险的我
0
技术揣摩
技术揣摩

引用来自“inuxor”的评论

玩php嘛,就别想着自己对数组实现什么底层玩法了。玩玩可以,真干活应该这个思路

<?php

$input = ['a' => 'aaa', 'b' => 'bbb', 'c' => 'ccc', 'd' => 'ddd',];
$add = ['cat'=>'blue','dog'=>'yellow',];
$output = array_merge($add, array_slice($input, 0, -2));
var_dump($output);






额,这还简单高效?直接写成array_splice($input,0,2,$add)不就好了?
技术揣摩
技术揣摩
回复 @小白变老白 : 看清楚函数名,自己去看文档,然后再来发评论好吗?
小白变老白
哥们 ,你写的代码你用过没有。你确定你最后传个数组参数是对的?最后一个参数明明是bool值,用来确认是否保留键值的好吗?
返回顶部
顶部