我有一个函数必须接受一个点数组,或一组点数组(一个2或3维数组).我正在寻找一种可靠的方法来检测它是否有2级或3级.问题是,我不能指望数组的键来进行检查,所以这不会起作用:
$levels = isset($array[0][0]) && is_array($array[0][0]) ? 3 : 2;
Run Code Online (Sandbox Code Playgroud)
..第一把钥匙可能不是0.通常是,但我不想依赖于此.无论如何,这是一个糟糕而且很有思想的方式.最理想的是,我想检查任意数量的级别,而不必遍历整个数组.
这是数组的外观:
array(5) {
[2] => array(2) {
[x] => 3
[y] => 6
}
[3] => array(2) {
[x] => 4
[y] => 8
}
...
Run Code Online (Sandbox Code Playgroud)
三维数组将包含这些数组.
一些说明:
写这篇文章时,我提出了一个可行的解决方案; 一个递归函数,检查数组的第一项,如果是,则在新发现的数组上调用自身等.
还有更好,更清洁的想法吗?支持可能同时具有标量值和数组的数组的加分点(例如,数组的第一项可能是字符串,但下一个是数组).
如果您期望完整的数组或完整的数组,那么您可以尝试: -
if (isset $points[0][0][0])
Run Code Online (Sandbox Code Playgroud)
但是,如果您的阵列稀疏则更难.基本问题是php"数组"实际上是一维哈希.诀窍是值可以是另一个"数组".因此,您需要访问第二级以确定它是值还是数组.
同样,如果您希望给定的数组仅包含点值,或者只包含其他数组,则只需要检查一个条目,这样:
if ( is_array(current(current($points))) )
Run Code Online (Sandbox Code Playgroud)
应该得到你想要的:current()函数返回当前数组指针(默认为第一个 - 所以它总是被设置为某个东西),所以内部电流($ points)会得到$ points [0]或者第一个带有实际值的条目,外部电流会得到类似$ points [0] [0]的东西.