PHP数组\u移位\u递归()
我试图做一个与array_shift_recursive()等价的操作,显然我的谷歌搜索失败了 采用以下包含字符串的多维数组:PHP数组\u移位\u递归(),php,recursion,multidimensional-array,Php,Recursion,Multidimensional Array,我试图做一个与array_shift_recursive()等价的操作,显然我的谷歌搜索失败了 采用以下包含字符串的多维数组: $array = [ 'shift6th' => [ 'shift3rd' => [ 'shift1st', //string 'shift2nd', //string ], 'shift4rd', //string 'shitf5th', //string
$array = [
'shift6th' => [
'shift3rd' => [
'shift1st', //string
'shift2nd', //string
],
'shift4rd', //string
'shitf5th', //string
],
'shift11th' => [
'shift10th', //string
'shift9th' => [
'shift7th', //string
'shift8th', //string
],
],
'shift12th', //string
];
关键是要以递归的方式返回并删除结束元素,因为数组可以有许多(戏剧上无限)维度。我已经按照我认为需要移位的顺序命名了字符串和键
我曾尝试复制一个函数,但它不起作用,因为数组_shift返回的是元素,而不是数组。这使得使用函数递归维度变得困难。这不起作用,并不断返回我
shift1st
(我期望如此),但数组保持不变,不移位
function array_shift_recursive(array $array) {
// recurse 1st child if it's array
if( !empty($array) && is_array(reset($array)) ){
return array_shift_recursive(reset($array));
}
//shift element from current array.
else{
return array_shift($array);
}
}
我知道一定是关于参考资料的。要知道引用是如何工作的,我还必须学会如何以及何时利用它。这就是说,很少有人提醒数组移位(&$array);参数本机通过引用传递
我找到了一种方法,通过将值切换为false,然后过滤数组中的空元素(该false的计算结果为),实现了这一点,但这似乎(对我来说)太长且效率低下。如果您愿意,请阅读下面的内容,但重点是避免这样做;)
然后我就可以做了
//This for now gives me the element i'm looking for as expected
$shifted=array_shift_recursive($array);
/** @TODO : get rid of this to remove the shifted element. */
//Replicate the top dimension path with a empty end element.
$empty=turn_false($array);
//Replace the array'S dimension with the empty dimension path
$replaced=array_replace_recursive($array,$empty);
//Remove the empty element (as a bonus it also strip empty array left behind after removing the element)
$array=array_filter_recursive($replaced,'isnot_empty');
/* OR (how i use it to combine those 3 lines in (kind of) one)
$array = array_filter_recursive(
array_replace_recursive(
$array, turn_false($array)
), 'isnot_empty'
);
*/
除了使用foreach循环而不是reset来获取数组中的第一个元素之外,我使用了与以前相同的逻辑。只重置标记并返回指针处的元素,这样我猜它又在复制了 如果要提前跳过空维度,可以在重新运行函数之前使用array_filter过滤掉空元素 感谢评论员们的提醒 考虑到这一输入:
$array = [
'abc' => [
'def',
'ghi' => [
'jkl', 'mno'
],
],
'pqr' => [
'stu', 'vwx'
],
'yz1',
'234' => [ '456' => [ '789' ] ]
];
使用此功能:
function array_shift_recursive(array &$array) {
foreach( $array as &$v ){
if( (!empty($v) && is_array($v) ) ){
return array_shift_recursive($v);
}
else{
return array_shift($array);
}
}
}
我们通过以下方式获得了预期结果:
var_dump(array_shift_recursive($array)); //string(3) "def"
var_dump(array_shift_recursive($array)); //string(3) "jkl"
var_dump(array_shift_recursive($array)); //string(3) "mno"
var_dump(array_shift_recursive($array)); //array(0) { } //dimension 'ghi'
var_dump(array_shift_recursive($array)); //array(0) { } //dimension 'abc'
var_dump(array_shift_recursive($array)); //string(3) "stu"
var_dump(array_shift_recursive($array)); //string(3) "vwx"
var_dump(array_shift_recursive($array)); //array(0) { } //dimension 'pqr'
var_dump(array_shift_recursive($array)); //string(3) "yz1"
var_dump(array_shift_recursive($array)); //string(3) "789"
var_dump(array_shift_recursive($array)); //array(0) { } //dimension '456'
var_dump(array_shift_recursive($array)); //array(0) { } //dimension '234'
var_dump(array_shift_recursive($array)); //NULL // Array is empty (yay!)
您忽略了原始PHP函数的一个重要方面:它将数组引用作为参数。需要引用以允许函数修改数组。因为参数不是通过引用传递的,所以您的函数会修改传递的数组的副本。无论您是否尝试在
array\u shift\u recursive
中使用被引用的$array
,我知道它与引用有关,就像我知道array\u shift将参数作为引用一样(或者它将无法在返回其他内容时修改数组)。这让我尝试了一些方法并获得了一些结果。
var_dump(array_shift_recursive($array)); //string(3) "def"
var_dump(array_shift_recursive($array)); //string(3) "jkl"
var_dump(array_shift_recursive($array)); //string(3) "mno"
var_dump(array_shift_recursive($array)); //array(0) { } //dimension 'ghi'
var_dump(array_shift_recursive($array)); //array(0) { } //dimension 'abc'
var_dump(array_shift_recursive($array)); //string(3) "stu"
var_dump(array_shift_recursive($array)); //string(3) "vwx"
var_dump(array_shift_recursive($array)); //array(0) { } //dimension 'pqr'
var_dump(array_shift_recursive($array)); //string(3) "yz1"
var_dump(array_shift_recursive($array)); //string(3) "789"
var_dump(array_shift_recursive($array)); //array(0) { } //dimension '456'
var_dump(array_shift_recursive($array)); //array(0) { } //dimension '234'
var_dump(array_shift_recursive($array)); //NULL // Array is empty (yay!)