有没有办法找出“深度”? PHP 数组是什么?
PHP 数组的元素可以有数组。 这些数组可以有数组等等。 有没有办法找出 PHP 数组中存在的最大嵌套数? 例如,如果初始数组没有数组作为元素,则该函数返回 1;如果至少有一个元素是数组,则返回 2,依此类推。
A PHP array can have arrays for its elements. And those arrays can have arrays and so on and so forth. Is there a way to find out the maximum nesting that exists in a PHP array? An example would be a function that returns 1 if the initial array does not have arrays as elements, 2 if at least one element is an array, and so on.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(20)
这是避免肯特·弗雷德里克指出的问题的另一种选择。 它为 print_r() 提供了检查无限递归的任务(它做得很好),并在输出中使用缩进找到数组的深度。
Here's another alternative that avoids the problem Kent Fredric pointed out. It gives print_r() the task of checking for infinite recursion (which it does well) and uses the indentation in the output to find the depth of the array.
这应该可以做到:
编辑:非常快速地测试它,它似乎可以工作。
This should do it:
Edit: Tested it very quickly and it appears to work.
当心只是递归地执行此操作的示例。
Php 可以创建引用该数组中其他位置的数组,并且可以包含具有类似递归引用的对象,并且在这种情况下任何纯粹的递归算法都可以被认为是一种危险幼稚的算法,因为它将溢出堆栈深度递归,并且永不终止。
(好吧,当它超过堆栈深度时它会终止,那时你的程序将致命终止,这不是我认为你想要的)
在过去,我尝试过序列化 - > 用字符串替换参考标记 -> 根据我的需要进行反序列化(经常调试带有大量递归引用的回溯),这似乎工作正常,你到处都有漏洞,但它适用于该任务。
对于您的任务,如果您发现数组/结构中出现了递归引用,您可能需要在此处查看用户贡献的评论:http://php.net/manual/en/language.references.spot.php
然后以某种方式找到一种方法来计算 a 的深度递归路径。
您可能需要拿出有关算法的计算机科学书籍并找到这些宝贝:
(抱歉这么简短,但深入研究图论有点不适合这种格式;))
Beware of the examples that just do it recursively.
Php can create arrays with references to other places in that array, and can contain objects with likewise recursive referencing, and any purely recursive algorithm could be considered in such a case a DANGEROUSLY naive one, in that it will overflow stack depth recursing, and never terminate.
( well, it will terminate when it exceeds stack depth, and at that point your program will fatally terminate, not what I think you want )
In past, I have tried serialise -> replacing reference markers with strings -> deserialise for my needs, ( Often debugging backtraces with loads of recursive references in them ) which seems to work OK, you get holes everywhere, but it works for that task.
For your task, if you find your array/structure has recursive references cropping up in it, you may want to take a look at the user contributed comments here: http://php.net/manual/en/language.references.spot.php
and then somehow find a way to count the depth of a recursive path.
You may need to get out your CS books on algorithms and hit up these babies:
( Sorry for being so brief, but delving into graph theory is a bit more than suited for this format ;) )
在这里受到一点启发并找到这个 RecursiveIteratorIterator PHP文档中的事情,我找到了这个解决方案。
您应该使用这个,非常简洁:
适用于 PHP5 和 PHP7,希望这会有所帮助。
After taking a little bit of inspiration here and after finding this RecursiveIteratorIterator thing in PHP Documentation, I came to this solution.
You should use this one, pretty neat :
Works on both PHP5 and PHP7, hope this helps.
您好,这是一个替代解决方案。
Hi This is an alternative solution.
当我注意到这篇文章时,我刚刚找到了这个问题的答案。 这是我的解决方案。 我还没有在大量不同的数组大小上尝试过这个方法,但是对于我正在处理的大约 30 个深度大于 4 的数据,它比 2008 年的答案要快。
警告:这不会处理任何边缘情况。 如果您需要一个强大的解决方案,请寻找其他地方,但对于简单的情况,我发现这非常快。
I had just worked out an answer to this question when I noticed this post. Here was my solution. I haven't tried this on a ton of different array sizes, but it was faster than the 2008 answer for the data I was working with ~30 pieces depth >4.
Warning: this doesn't handle any edge cases. If you need a robust solution look elsewhere, but for the simple case I found this to be pretty fast.
这是我对 jeremy Ruten 函数稍加修改的版本,
像
print array_depth($GLOBALS)
这样的东西不会因为递归而出错,但你可能不会得到你期望的结果。Here's my slightly modified version of jeremy Ruten's function
Things like
print array_depth($GLOBALS)
won't error due to the recursion, but you may not get the result you expected.Jeremy Ruten 对函数的另一个(更好)修改:
向 $childrenkey 添加默认值允许该函数适用于没有子元素键的简单数组,即它适用于简单的多维数组。
现在可以使用以下方式调用此函数:
或者
当 $my_array 没有任何用于存储其子元素的特定键时。
Another (better) modification to the function from Jeremy Ruten:
Adding a default value to $childrenkey allows the function to work for simple array with no keys for child elements, i.e. it will work for simple multi-dimensional arrays.
This function can now be called using:
or
when $my_array doesn't have any specific key for storing its child elements.
Josh 提出的函数肯定更快:
The function proposed by Josh was definitely faster:
这是一个老问题,但至今仍具有相关性。 :)
不妨对 Jeremy Ruten 的答案做出一点小小的修改。
我添加了第二个名为 $childrenkey 的参数,因为我将子元素存储在特定的键中。
函数调用的一个例子是:
An old question, yet remain relevant to this date. :)
Might as well contribute a minor modification to the answer from Jeremy Ruten.
I added a second parameter called $childrenkey because I store the child elements in a specific key.
An example of the function call is:
这个似乎对我来说效果很好
This one seems to work fine for me
我不认为有任何内置的东西。不过,一个简单的递归函数可以很容易地找出来。
I don't think there's anything built in. A simple recursive function could easily find out though.
我认为肯特·弗雷德里克强调的问题至关重要。
yjerem 和 Asim 提出的答案很容易受到这个问题的影响。
yjerem 再次建议的缩进方法和 dave1010 对我来说不够稳定,因为它依赖于 print_r 函数表示缩进的空格数量。 它可能会因时间/服务器/平台而异。
JoshN 建议的方法可能是正确的,但我认为我的方法更快:
如果您进行任何比较不同方法的测试,请发布消息。
J
I believe the problem highlighted by Kent Frederic is crucial.
The answer suggested by yjerem and Asim are vulnerable to this problem.
The approaches by indentation suggested by yjerem again, and dave1010 are not stable enough to me because it relies on the number of spaces that represent an indentation with the print_r function. It might vary with time/server/platform.
The approach suggested by JoshN might be correct, but I think mine is faster :
Post a message if you undertake any testing comparing the different methods.
J
我相信您忘记过滤“[”和“]”或“,”和“:”以及数组的键和值的数据类型。 这是 array_depth 的更新以及额外的 array_sort_by_depth。
请随意改进代码:D!
I believe you forgot to filter '[' and ']' or ',' and ':' and the data type of the array's key(s) and value(s). Here's an update of your array_depth plus a bonus array_sort_by_depth.
Feel free to improve the code :D!
我认为这可以解决递归问题,并且还可以在不依赖其他 php 函数(如 serialize 或 print_r)的情况下提供深度(这充其量是有风险的,可能会导致棘手的错误):
I think this would solve the recursion problem, and also give the depth without relying on other php functions like serialize or print_r (which is risky at best and can lead to intractable bugs):
在我的解决方案中,我评估 ARRAY() 的维度,而不是内容/值:
对我来说是速度,并且复杂度低
in my solution, I evaluate dimension of ARRAY(), not contents/values:
for me is speed, and low complex
我将使用以下代码:
I would use the following code:
更快的方法:
A quicker way: