PHP数组\u移位\u递归()

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_shift_recursive()等价的操作,显然我的谷歌搜索失败了

采用以下包含字符串的多维数组:

$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!)