Sprawdzanie czy tablica jest wielowymiarowa czy nie?

  1. Jaki jest najskuteczniejszy sposób sprawdzenia czy tablica jest płaską tablicą o prymitywnych wartościach czy jeśli jest to wielowymiarowa tablica?
  2. Czy Jest jakiś sposób, aby to zrobić bez pętli przez array and running is_array() on each of its elements?
Author: Josua Marcel Chrisano, 2008-09-28

22 answers

Krótka odpowiedź brzmi: Nie, Nie możesz tego zrobić bez przynajmniej zapętlenia, jeśli 'drugi wymiar' może być gdziekolwiek. Jeśli musi być w pierwszym elemencie, po prostu wykonaj

is_array($arr[0]);

Ale najskuteczniejszym ogólnym sposobem, jaki mogłem znaleźć, jest użycie pętli foreach na tablicy, shortcircuiting za każdym razem, gdy zostanie znalezione trafienie (przynajmniej pętla implicit jest lepsza niż prosta 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

Ukryte zapętlenie, ale nie możemy zwinąć, gdy tylko dopasowanie zostanie znalezione...

$ 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)
 117
Author: Vinko Vrsalovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 07:15:27

Użyj count () dwa razy; jeden raz w trybie domyślnym i jeden raz w trybie rekurencyjnym. Jeśli wartości są zgodne, tablica jest , a nie wielowymiarowa, ponieważ tablica wielowymiarowa miałaby większą liczbę rekurencyjną.

if (count($array) == count($array, COUNT_RECURSIVE)) 
{
  echo 'array is not multidimensional';
}
else
{
  echo 'array is multidimensional';
}

Ta opcja druga wartość mode została dodana w PHP 4.2.0. Z PHP Docs:

Jeśli opcjonalny parametr mode jest ustawiony na COUNT_RECURSIVE (lub 1), count () policzy tablicę rekurencyjnie. Jest to szczególnie przydatne do liczenia wszystkich elementy wielowymiarowej tablicy. count() nie wykrywa nieskończonej rekurencji.

Jednak ta metoda nie wykrywa array(array()).

 172
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-29 02:32:53

Dla PHP 4.2.0 lub nowszego:

function is_multi($array) {
    return (count($array) != count($array, 1));
}
 27
Author: scronide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 21:02:18

Możesz po prostu wykonać to:

if (count($myarray) !== count($myarray, COUNT_RECURSIVE)) return true;
else return false;

Jeśli opcjonalny parametr mode jest ustawiony na COUNT_RECURSIVE (lub 1), count() policzy tablicę rekurencyjnie. Jest to szczególnie przydatne do liczenia wszystkich elementów tablicy wielowymiarowej.

Jeśli jest taki sam, oznacza to, że nie ma nigdzie podpoziomów. Łatwo i szybko!

 9
Author: Pian0_M4n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 14:23:05

Myślę, że jest to najbardziej prosta droga i jest najnowocześniejsza:

function is_multidimensional(array $array) {
    return count($array) !== count($array, COUNT_RECURSIVE);
}
 8
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 18:16:29

Można sprawdzić is_array() Na pierwszym elemencie, przy założeniu, że jeśli pierwszy element tablicy jest tablicą, to reszta też.

 7
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 06:25:25

Wszystkie świetne odpowiedzi... oto moje trzy linijki, których zawsze używam

function isMultiArray($a){
    foreach($a as $v) if(is_array($v)) return TRUE;
    return FALSE;
}
 4
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 02:22:15

Ta funkcja zwróci int liczbę wymiarów tablicy (skradzionych z Tutaj ).

function countdim($array)
{
   if (is_array(reset($array))) 
     $return = countdim(reset($array)) + 1;
   else
     $return = 1;

   return $return;
}
 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 06:26:18

Myślę, że przekonasz się, że ta funkcja jest najprostszym, najbardziej wydajnym i najszybszym sposobem.

function isMultiArray($a){
    foreach($a as $v) if(is_array($v)) return TRUE;
    return FALSE;
}

Możesz to przetestować TAK:

$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';
 2
Author: RoboTamer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 04:37:43

Możesz również wykonać proste sprawdzenie w ten sposób:

$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
 1
Author: Prashant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-25 05:51:30

Spróbuj w następujący sposób

if (count($arrayList) != count($arrayList, COUNT_RECURSIVE)) 
{
  echo 'arrayList is multidimensional';

}else{

  echo 'arrayList is no multidimensional';
}
 1
Author: Arshid KV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 19:25:47

Myślę, że ten jest z klasą (rekwizyty do innego użytkownika nie znam jego nazwy użytkownika):

static public function isMulti($array)
{
    $result = array_unique(array_map("gettype",$array));

    return count($result) == 1 && array_shift($result) == "array";
}
 0
Author: Alfonso Fernandez-Ocampo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 00:30:10

Wszystkie powyższe metody są zbyt skomplikowane do szybkiego wdrożenia. Jeśli tablica jest płaska, testowanie pierwszego elementu powinno zwrócić prymitywną np. int, string e.T.c. jeśli jest wielowymiarowa, powinna zwrócić tablicę. Dzięki temu możesz używać tej jednej wkładki szybko i schludnie.

echo is_array(array_shift($myArray));

Jeśli to zwróci true, tablica jest wielowymiarowa. Inaczej jest płaski. Dla przypomnienia, bardzo rzadko tablice mają różne wymiary, np. jeśli generujesz dane z modelu, zawsze będą miały ten sam typ wielowymiarowej lub płaskiej struktury, którą można przemierzać za pomocą pętli. pętle wykonane maszynowo Jeśli tak nie jest, to masz niestandardowe zbudowanie go ręcznie, co oznacza, że wiesz, gdzie wszystko będzie i po prostu działa bez potrzeby pisania algorytmu pętli Tutaj wpisz opis obrazka

 0
Author: Nelson Emeka Ameyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 10:17:11

Oprócz poprzednich odpowiedzi i w zależności od schematu tablicy, którą chcesz sprawdzić:

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;
}
 0
Author: RafaSashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 19:19:48

Nawet to działa

is_array(current($array));

If false its a single dimension array if true its a multi dimension array.

Current da ci pierwszy element tablicy i sprawdzi, czy pierwszy element jest tablicą, czy nie za pomocą funkcji is_array.

 0
Author: Priyank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 13:17:26

Nie używaj COUNT_RECURSIVE

Kliknij tutaj, aby dowiedzieć się dlaczego

Użyj rsort, a następnie użyj isset

function is_multi_array( $arr ) {
rsort( $arr );
return isset( $arr[0] ) && is_array( $arr[0] );
}
//Usage
var_dump( is_multi_array( $some_array ) );
 0
Author: hendra1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-25 16:06:41

W moim przypadku. Utknąłem w dziwnym stanie.
1. przypadek = array("data"=> "name");
2. przypadek = array("data"=> array("name"=>"username","fname"=>"fname"));
Ale jeśli data ma tablicę zamiast wartości, to funkcja sizeof() lub count () nie działa dla tego warunku. Następnie tworzę niestandardową funkcję do sprawdzenia.
Jeżeli pierwszy indeks tablicy ma wartość, wtedy zwraca "only value"
Ale jeśli indeks ma tablicę zamiast wartości, to zwraca "has array"
I use this way

 function is_multi($a) {
        foreach ($a as $v) {
          if (is_array($v)) 
          {
            return "has array";
            break;
          }
          break;
        }
        return 'only value';
    }

Specjalne podziękowania dla Vinko Vrsalovic

 0
Author: Darkcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 10:41:32

Natywna funkcja print_r zwraca czytelny dla człowieka łańcuch znaków. Wystarczy policzyć instancje "Array".

Spróbuj...
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)

Na moim pudełku, "is_multi trwało 0.83681297302246 sekund w 500000 razy"

Dzięki Uprzejmości: Ruach HaKodesh

 0
Author: Racer X,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 19:11:22
if($array[0]){
//enter your code 
}
 -1
Author: rthcupid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-28 11:39:11
if ( array_key_exists(0,$array) ) {

// multidimensional array

}  else {

// not a multidimensional array

}

*tylko do tablic z indeksem liczbowym

 -1
Author: sudhin babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-26 13:07:26
function isMultiArray(array $value)
{
    return is_array(reset($value));
}
 -2
Author: jhonatan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-24 11:00:00
is_array($arr[key($arr)]); 

Brak pętli, proste i proste.

Działa również z tablicami skojarzonymi, nie tylko numerycznymi, które nie mogą zawierać 0 ( jak w poprzednim przykładzie wyświetli ostrzeżenie, jeśli tablica nie ma 0. )

 -3
Author: Carlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 04:34:15