我面临保留键的数组拼接问题,因此编写了以下功能:
我通过将每个项目包装在数组中来解决问题,但似乎存在一些内存效率低下的语句。
你有什么想法吗?
谢谢。
array_splice_pk
与array_splice
不同,它可以保留键。
概览:
&$input
-> 与array_splice
相同。$key
-> 目标键。$use_key_as_offset
-> 使用$key
参数作为数字偏移量。$length
-> 与array_splice
相同。$replacement
-> 与array_splice
相同。但你也可以为每个值提供键。
代码:
function array_splice_pk(&$input, $key, $use_key_as_offset = false, $length = 0, $replacement = null) {
if (!is_array($input) || !is_scalar($key)) {
return array();
}
if ($replacement !== null) {
$replacement = array($replacement);
if (!is_array($replacement[0])) {
$replacement = array($replacement);
}
}
$wrapper = array();
foreach ($input as $k => $v) {
$wrapper[] = array($k => $v);
}
$del_key = null;
foreach ($wrapper as $k => $v) {
if ($use_key_as_offset) {
if ($k === (int)$key) {
$del_key = $k;
break;
}
} else {
if (key($v) == $key) {
$del_key = $k;
break;
}
}
}
if ($del_key === null) {
return array();
}
if ($replacement === null) {
$wrapper_ret = array_splice($wrapper, $del_key, $length);
} else {
$wrapper_ret = array_splice($wrapper, $del_key, $length , $replacement);
}
$ret = $input = array();
foreach ($wrapper_ret as $wrap) {
list($k, $v) = each($wrap);
$ret[$k] = $v;
}
foreach ($wrapper as $wrap) {
list($k ,$v) = each($wrap);
$input[$k] = $v;
}
return $ret;
}
样例:
$arr1 = $arr2 = array(
'one' => 'test',
'two' => 'test',
'three' => 'test',
'four' => 'test',
);
$ret1 = array_splice_pk($arr1, 'three', false, 1, array('fizz' => '!!!'));
$ret2 = array_splice_pk($arr2, 2 , true , 1, array('fizz' => '!!!'));
var_dump('Result1', $arr1, $ret1, 'Result2', $arr2, $ret2);
结果:
string(7) "Result1"
array(4) {
["one"]=>
string(4) "test"
["two"]=>
string(4) "test"
["fizz"]=>
string(3) "!!!"
["four"]=>
string(4) "test"
}
array(1) {
["three"]=>
string(4) "test"
}
string(7) "Result2"
array(4) {
["one"]=>
string(4) "test"
["two"]=>
string(4) "test"
["fizz"]=>
string(3) "!!!"
["four"]=>
string(4) "test"
}
array(1) {
["three"]=>
string(4) "test"
}
array_splice
确实会 保留字符串键。你只是使用字符串键。array_splice
有什么问题? - deceze$replacement + $original
来覆盖或插入特定的键。如果你想要删除键,最好在单独的步骤中完成。通过数字位置用其他字符串键替换字符串键似乎是一种奇怪的操作。 - deceze