检查数组是否是多维的?
-
02-07-2019 - |
题
- 检查阵列平面阵列的最有效方法是什么 原始值或者如果它是多维数组?
- 有没有办法在没有实际循环的情况下执行此操作
数组并在其每个元素上运行
is_array()
?
醇>
解决方案
简短的回答是,如果“第二维”可能在任何地方,至少没有隐式循环,你就不能这样做。如果它必须在第一项中,你只需要
is_array($arr[0]);
但是,我能找到的最有效的一般方法是在数组上使用foreach循环,每当发现命中时短路(至少隐式循环优于直接for()):
$ more multi.php
<?php
$a = array(1 => 'a',2 => 'b',3 => array(1,2,3));
$b = array(1 => 'a',2 => 'b');
$c = array(1 => 'a',2 => 'b','foo' => array(1,array(2)));
function is_multi($a) {
$rv = array_filter($a,'is_array');
if(count($rv)>0) return true;
return false;
}
function is_multi2($a) {
foreach ($a as $v) {
if (is_array($v)) return true;
}
return false;
}
function is_multi3($a) {
$c = count($a);
for ($i=0;$i<$c;$i++) {
if (is_array($a[$i])) return true;
}
return false;
}
$iters = 500000;
$time = microtime(true);
for ($i = 0; $i < $iters; $i++) {
is_multi($a);
is_multi($b);
is_multi($c);
}
$end = microtime(true);
echo "is_multi took ".($end-$time)." seconds in $iters times\n";
$time = microtime(true);
for ($i = 0; $i < $iters; $i++) {
is_multi2($a);
is_multi2($b);
is_multi2($c);
}
$end = microtime(true);
echo "is_multi2 took ".($end-$time)." seconds in $iters times\n";
$time = microtime(true);
for ($i = 0; $i < $iters; $i++) {
is_multi3($a);
is_multi3($b);
is_multi3($c);
}
$end = microtime(true);
echo "is_multi3 took ".($end-$time)." seconds in $iters times\n";
?>
$ php multi.php
is_multi took 7.53565130424 seconds in 500000 times
is_multi2 took 4.56964588165 seconds in 500000 times
is_multi3 took 9.01706600189 seconds in 500000 times
隐式循环,但我们不能在找到匹配后立即短路...
$ more multi.php
<?php
$a = array(1 => 'a',2 => 'b',3 => array(1,2,3));
$b = array(1 => 'a',2 => 'b');
function is_multi($a) {
$rv = array_filter($a,'is_array');
if(count($rv)>0) return true;
return false;
}
var_dump(is_multi($a));
var_dump(is_multi($b));
?>
$ php multi.php
bool(true)
bool(false)
其他提示
使用count()两次;一次处于默认模式,一次处于递归模式。如果值匹配,则数组不多维,因为多维数组将具有更高的递归计数。
if (count($array) == count($array, COUNT_RECURSIVE))
{
echo 'array is not multidimensional';
}
else
{
echo 'array is multidimensional';
}
在PHP 4.2.0中添加了此选项第二个值 mode
。来自 PHP文档:
如果可选模式参数设置为COUNT_RECURSIVE(或1),count()将递归计数数组。这对于计算多维数组的所有元素特别有用。 count()不会检测到无限递归。
但是,此方法不检测 array(array())
。
对于PHP 4.2.0或更高版本:
function is_multi($array) {
return (count($array) != count($array, 1));
}
我认为这是最直接的方式,它是最先进的:
function is_multidimensional(array $array) {
return count($array) !== count($array, COUNT_RECURSIVE);
}
你可以简单地执行:
if (count($myarray) !== count($myarray, COUNT_RECURSIVE)) return true;
else return false;
如果可选模式参数设置为 COUNT_RECURSIVE
(或1),count()将递归计数数组。这对于计算多维数组的所有元素特别有用。
如果它是相同的,意味着任何地方都没有分层。简单快捷!
您可以在第一个元素上查看 is_array()
,假设如果数组的第一个元素是数组,那么其余元素也是如此。
所有伟大的答案......这是我一直在使用的三行
function isMultiArray($a){
foreach($a as $v) if(is_array($v)) return TRUE;
return FALSE;
}
此函数将返回int数组维度(从此处一>)。
function countdim($array)
{
if (is_array(reset($array)))
$return = countdim(reset($array)) + 1;
else
$return = 1;
return $return;
}
我认为你会发现这个功能是最简单,最有效,最快捷的方式。
function isMultiArray($a){
foreach($a as $v) if(is_array($v)) return TRUE;
return FALSE;
}
你可以这样测试:
$a = array(1 => 'a',2 => 'b',3 => array(1,2,3));
$b = array(1 => 'a',2 => 'b');
echo isMultiArray($a) ? 'is multi':'is not multi';
echo '<br />';
echo isMultiArray($b) ? 'is multi':'is not multi';
你也可以这样做一个简单的检查:
$array = array('yo'=>'dream', 'mydear'=> array('anotherYo'=>'dream'));
$array1 = array('yo'=>'dream', 'mydear'=> 'not_array');
function is_multi_dimensional($array){
$flag = 0;
while(list($k,$value)=each($array)){
if(is_array($value))
$flag = 1;
}
return $flag;
}
echo is_multi_dimensional($array); // returns 1
echo is_multi_dimensional($array1); // returns 0
尝试以下
if (count($arrayList) != count($arrayList, COUNT_RECURSIVE))
{
echo 'arrayList is multidimensional';
}else{
echo 'arrayList is no multidimensional';
}
请勿使用COUNT_RECURSIVE
使用rsort然后使用isset
function is_multi_array( $arr ) {
rsort( $arr );
return isset( $arr[0] ) && is_array( $arr[0] );
}
//Usage
var_dump( is_multi_array( $some_array ) );
我认为这个是优雅的(道具给另一个用户,我不知道他的用户名):
static public function isMulti($array)
{
$result = array_unique(array_map("gettype",$array));
return count($result) == 1 && array_shift($result) == "array";
}
除了之前的答案,还要根据您要检查的阵列架构进行检查:
function is_multi_array($array=[],$mode='every_key'){
$result = false;
if(is_array($array)){
if($mode=='first_key_only'){
if(is_array(array_shift($array))){
$result = true;
}
}
elseif($mode=='every_key'){
$result = true;
foreach($array as $key => $value){
if(!is_array($value)){
$result = false;
break;
}
}
}
elseif($mode=='at_least_one_key'){
if(count($array)!==count($array, COUNT_RECURSIVE)){
$result = true;
}
}
}
return $result;
}
即使这样也可以
is_array(current($array));
如果 false ,如果 true ,则单维数组多维数组。
当前将为您提供数组的第一个元素,并通过 is_array 函数检查第一个元素是否为数组。
就我而言。我陷入了各种奇怪的状态。
第一种情况= 数组(&quot; data&quot; =&gt;&quot; name&quot;);
第二种情况= 数组(&quot; data&quot; =&gt; array(&quot; name&quot; =&gt;&quot; username&quot;,&quot; fname&quot; =&gt;&quot; fname&quot;));
但是,如果 data
具有数组而不是值,则sizeof()或count()函数不适用于此条件。然后我创建自定义功能来检查。
点击
如果数组的第一个索引具有值,则它返回“仅值”。点击
但是如果索引有数组而不是值,那么它返回“有数组”。点击
我用这种方式
function is_multi($a) {
foreach ($a as $v) {
if (is_array($v))
{
return "has array";
break;
}
break;
}
return 'only value';
}
特别感谢 Vinko Vrsalovic
就像
一样简单$isMulti = !empty(array_filter($array, function($e) {
return is_array($e);
}));
if($array[0]){
//enter your code
}
if ( array_key_exists(0,$array) ) {
// multidimensional array
} else {
// not a multidimensional array
}
*仅限于具有数字索引的数组
本机print_r函数返回一个人类可读的字符串。只需计算“数组”即可。实例
尝试...
substr_count(print_r([...array...], true), 'Array') > 1;
$a = array(1 => 'a',2 => 'b',3 => array(1,2,3));
$b = array(1 => 'a',2 => 'b');
$c = array(1 => 'a',2 => 'b','foo' => array(1,array(2)));
$d = array(array());
$e = array(1, array());
$f = array(array(), array());
$g = array("hello", "hi" => "hi there");
$h[] = $g;
var_dump(substr_count(print_r($a, true), 'Array') > 1);
...
//a: bool(true)
//b: bool(false)
//c: bool(true)
//d: bool(true)
//e: bool(true)
//f: bool(true)
//g: bool(false)
//h: bool(true)
在我的方框中,“is_multi在500000次中获得了0.83681297302246秒”
礼貌:Ruach HaKodesh
function isMultiArray(array $value)
{
return is_array(reset($value));
}
is_array($arr[key($arr)]);
没有循环,简单明了。
也可以使用关联数组,而不仅仅是数字数组,它不能包含0(如前面的例子中,如果数组没有0,则会向你发出警告。)