यह देखना कि क्या सरणी बहुआयामी है या नहीं?


137
  1. यह जांचने के लिए सबसे प्रभावी तरीका है कि क्या एक सरणी आदिम मूल्यों का एक फ्लैट सरणी है या यदि यह एक बहुआयामी सरणी है ?
  2. क्या वास्तव में एक सरणी के माध्यम से लूपिंग और is_array()इसके प्रत्येक तत्व पर चलने के बिना ऐसा करने का कोई तरीका है ?

9
यह इंगित करने के लायक है कि PHP में वास्तविक बहुआयामी सरणियाँ नहीं हैं - बस साधारण साहचर्य सरणी का मान है। तो आपका प्रश्न वास्तव में पूछ रहा है "क्या मेरे सरणी में एक गैर-स्केलर मूल्य है"?
गहुआ

21
वास्तव में ... मुझे नहीं लगता कि यह बिल्कुल इंगित करने लायक है।
जो

जवाबों:


135

संक्षिप्त उत्तर यह है कि आप इसे कम से कम लूपिंग के बिना नहीं कर सकते, यदि 'दूसरा आयाम' कहीं भी हो। यदि यह पहले आइटम में होना है, तो आप बस करेंगे

is_array($arr[0]);

लेकिन, सबसे कुशल सामान्य तरीका जो मुझे मिल सकता है वह है सरणी पर फ़ॉरच लूप का उपयोग करना, जब भी कोई हिट मिले तो शॉर्टकर्किट करना (कम से कम निहित लूप सीधे के लिए () से बेहतर है):

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

3
अच्छा, उस कैविएट के साथ जो मैं मानता हूं कि आपकी फ़िल्टरिंग लाइन में array_map ("is_array", $ a) होना चाहिए, is_array का उपयोग नंगेपन के रूप में नहीं।
मैथ्यू शार्ले

अच्छा कैच, जो कि sp_ is_multi तक फैला हुआ है, लेकिन फिर भी मैच्योर होने के लिए काफी अच्छा नहीं है
विंको वर्सालोविच सेप

2
यह ध्यान देने योग्य है कि, जैसा कि लिखा गया है, मल्टी_3 केवल शून्य-आधारित गैर-साहचर्य सरणियों पर काम करेगा, जो सूचकांकों में कोई अंतराल नहीं है, जिसका अर्थ है कि यह इनमें से किसी भी उदाहरण को बहु-आयामी के रूप में सही ढंग से पहचान नहीं करेगा।
क्रैजमोंकी

फ़ंक्शन is_multi()में कोड का अनुकूलन करकेreturn count($rv)>0
Xorifelse

अनुकूलित कुंजियों के लिए समाधान के रूप में is_array (array_values ​​($ arr) [0]) है।
विटोर रॉड्रिक्स

191

गणना का उपयोग करें () दो बार; डिफ़ॉल्ट मोड में एक बार और पुनरावर्ती मोड में एक समय। यदि मान मेल खाते हैं, तो सरणी बहुआयामी नहीं है , क्योंकि बहुआयामी सरणी में एक उच्च पुनरावर्ती गिनती होगी।

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

यह विकल्प दूसरी वैल्यू modePHP 4.2.0 में जोड़ा गया था। से पीएचपी डॉक्स :

यदि वैकल्पिक मोड पैरामीटर COUNT_RECURSIVE (या 1) पर सेट है, तो काउंट () पुनरावर्ती रूप से सरणी की गणना करेगा। यह एक बहुआयामी सरणी के सभी तत्वों की गिनती के लिए विशेष रूप से उपयोगी है। गिनती () अनंत पुनरावृत्ति का पता नहीं लगाती है।

हालाँकि इस विधि का पता नहीं चलता है array(array())


2
जैसा कि यह उल्लेख किया गया है कि यह खाली सरणियों वाले तत्वों के लिए काम नहीं करता है
आर्थर

30

PHP 4.2.0 या नए के लिए:

function is_multi($array) {
    return (count($array) != count($array, 1));
}

array(array())या array(array(), array())तो काम नहीं कर रहा है । आम तौर पर, यदि कोई अंदर का सरणी खाली होता है, तो पुनरावर्ती गिनती इसके लिए ठीक से 0 जोड़ देगा, इस प्रकार यह सामान्य गिनती से मेल खाती है।
फणीस हत्जिदकिस

13

मुझे लगता है कि यह सबसे सीधा रास्ता है और यह अत्याधुनिक है:

function is_multidimensional(array $array) {
    return count($array) !== count($array, COUNT_RECURSIVE);
}

9

आप बस इसे निष्पादित कर सकते हैं:

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

यदि वैकल्पिक मोड पैरामीटर को COUNT_RECURSIVE(या 1) पर सेट किया गया है , तो गणना () आवर्ती की गणना करेगा। यह एक बहुआयामी सरणी के सभी तत्वों की गिनती के लिए विशेष रूप से उपयोगी है।

यदि यह एक ही है, तो इसका मतलब है कि कहीं भी एक प्रकार की मछली नहीं है। आसान और तेज!


धन्यवाद ... उपयोगी। मुझे लगता है कि मेरी सरणी के लिए एक उप स्तर से ही अस्तित्व में जाँच करना चाहता था, मैं प्रयोग किया जाता हैif(count($tasks_by_date) !== count($tasks_by_date, 1))
माइक Barwick

ठंडा। COUNT_RECURSIVE या 1 गिनती के लिए समान है ()
Pian0_M4n

पूर्ण रूप से। मुझे बस कम अव्यवस्था पसंद है और !==देखने के लिए इस्तेमाल किया गया था उप स्तर मौजूद है। सिद्धांतों के लिए जो कुछ इसी तरह की तलाश में हो सकते हैं ... आदि।
माइक बैरविक

क्या आप था मेरे लिए सही नहीं लौटा रहा था ... मैं जोड़ने के लिए की जरूरत है!==
माइक Barwick

खाली सरणी के साथ, विफल रहता है
वालेस मैक्सर्स

7

आप is_array()पहले तत्व को देख सकते हैं , इस धारणा के तहत कि यदि किसी सरणी का पहला तत्व एक सरणी है, तो उनमें से बाकी भी हैं।


यह वास्तव में एक अच्छा बिंदु है। मेरे विशेष मामले में, मूल सरणी के निर्माण को नियंत्रित करने के बाद से यह या तो / या स्थिति है। मैं अब के लिए प्रश्न को खुला छोड़ दूंगा अगर कोई हल हो जो आम तौर पर अधिक काम करे।
विल्को

5
इस तरह:if( is_array(current($arr)) ) { // is multidimensional }
जोनास elppelgran

4

सभी महान जवाब ... यहाँ मेरी तीन लाइनें हैं जो मैं हमेशा उपयोग कर रहा हूं

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

2

यह फ़ंक्शन सरणी आयामों ( यहां से चोरी ) की संख्या को वापस लौटा देगा ।

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

   return $return;
}

यह केवल ग्रेग के मामले के लिए काम करेगा। यह समस्या का एक सामान्य समाधान नहीं है जहाँ दूसरा आयाम सरणी में कहीं भी हो सकता है
विंको व्रास्लोविक

$ गिरफ्तार = सरणी ("नमस्ते", "हाय" => "हाय वहाँ"); $ गिरफ्तार [] = & arr; // उफ़
Tyzoid

2

मुझे लगता है कि आप पाएंगे कि यह फ़ंक्शन सबसे सरल, सबसे कुशल और सबसे तेज़ तरीका है।

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';

यदि आप एक-लाइन में जा रहे हैं तो कम से कम पूरी बात करें; foreach($a as $v) is_array($v) ? return TRUE : return FALSE;
रॉबर्ट पाउंडर

@ रोबर्टपाउंडर या यहां तक ​​किforeach($a as $v) return is_array($v) ? true : false;
यासीन सेदरानी

2

PHP 7 के बाद आप बस कर सकते हैं:

public function is_multi(array $array):bool
{
    return is_array($array[array_key_first($array)]);
}

1

आप इस तरह से एक साधारण जाँच भी कर सकते हैं:

$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

निम्नानुसार प्रयास करें

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

}else{

  echo 'arrayList is no multidimensional';
}

1

यहां तक ​​कि यह काम करता है

is_array(current($array));

यदि इसका एकल आयाम सरणी असत्य है यदि सही इसका बहु आयाम सरणी है।

करंट आपको आपके एरे का पहला एलीमेंट देगा और यह चेक करेगा कि पहला एलीमेंट किसी अरेंज फंक्शन का है या नहीं ।


यह विश्वसनीय नहीं होगा यदि आप यह सुनिश्चित करना चाहते हैं कि किसी भी अन्य तत्व को नेस्टेड नहीं किया गया है।
वैनमारॉन्गेन

1

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 ) );

$ गिरफ्तार [0] नहीं हो सकता है और सरणी नहीं है, लेकिन $ गिरफ्तार [1] एक सरणी हो सकती है
सुपुन प्रणीत

1

मेरे मामले में। मैं अजीब स्थिति में फंस गया।
1 मामला = array("data"=> "name");
दूसरा मामला = array("data"=> array("name"=>"username","fname"=>"fname"));
लेकिन अगर dataमूल्य के बजाय सरणी है तो आकार () या गिनती () फ़ंक्शन इस स्थिति के लिए काम नहीं करते हैं। फिर मैं जांच करने के लिए कस्टम फ़ंक्शन बनाता हूं।
यदि सरणी के पहले सूचकांक में मान है तो यह "केवल मान" लौटाता है
लेकिन यदि सूचकांक में मान के बजाय सरणी है तो यह "
इस प्रकार का उपयोग करता है " तो "रिटर्न" है।

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

Vinko Vrsalovic के लिए विशेष धन्यवाद


0

मुझे लगता है कि यह एक उत्तम दर्जे का है (किसी अन्य उपयोगकर्ता के लिए मैं उसके उपयोगकर्ता नाम नहीं जानता):

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

    return count($result) == 1 && array_shift($result) == "array";
}

0

उपरोक्त सभी विधियाँ त्वरित रोलिंग के लिए बहुत जटिल हैं। यदि कोई सरणी समतल है, तो पहले तत्व का परीक्षण एक आदिम उदाहरण जैसे int, string आदि को लौटाना चाहिए। यदि यह बहुआयामी है, तो इसे एक सरणी लौटना चाहिए। विस्तार से, आप इस एक लाइनर का उपयोग तेज और साफ कर सकते हैं।

echo is_array(array_shift($myArray));

यदि यह सही है, तो सरणी बहुआयामी है। और यह समतल है। बस ध्यान दें, सरणियों के विभिन्न आयामों के लिए यह बहुत दुर्लभ है जैसे यदि आप किसी मॉडल से डेटा उत्पन्न कर रहे हैं, तो इसमें हमेशा एक ही प्रकार के बहुआयामी या सपाट संरचना होगी जो लूप द्वारा ट्रैवर्स की जा सकती है। मशीन से बने लूप यदि ऐसा नहीं है, तो आपने कस्टम को हाथ से बनाया है, जिसका अर्थ है कि आप जानते हैं कि सब कुछ कहां होगा और यह सिर्फ लूपिंग एल्गोरिदम लिखने की आवश्यकता के बिना काम करता है यहां छवि विवरण दर्ज करें


यह तकनीक केवल बहुआयामी सरणियों को खोजती है यदि पहला तत्व एक सरणी है।
क्रैगमॉन्की

उपयोग करने के साथ सतर्क रहें array_shift(), क्योंकि यह पहला तत्व निकालता है और संख्यात्मक कुंजियों को भी रीसेट करता है! current()एक लाइनर के लिए अभी भी खुजली हो तो बेहतर उपयोग करें ।
Marcello Mönkemeyer

0

पिछले उत्तरों के अलावा और उस सरणी के स्कीमा पर निर्भर करता है जिसे आप जांचना चाहते हैं:

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
$is_multi_array = array_reduce(array_keys($arr), function ($carry, $key) use ($arr) { return $carry && is_array($arr[$key]); }, true);

यहाँ एक अच्छा एक लाइनर है। यह जांचने के लिए हर कुंजी पर निर्भर करता है कि क्या उस कुंजी का मान एक सरणी है। यह सुनिश्चित करेगा


-1
if($array[0]){
//enter your code 
}

कम से कम उपयोग करें if (isset($array[0])) { }। यदि आप सुनिश्चित हैं कि सरणी के
अनुक्रम

एक बहु-आयामी सरणी एक ऐसा सरणी है जिसमें एक या अधिक सरणियाँ होती हैं। यह केवल यह देखने के लिए जांचता है कि क्या इसमें शून्य की कुंजी वाला तत्व है।
क्रैगमॉन्की

-1
if ( array_key_exists(0,$array) ) {

// multidimensional array

}  else {

// not a multidimensional array

}

* केवल संख्यात्मक सूचकांक के साथ उन सरणियों के लिए


एक बहु-आयामी सरणी एक ऐसा सरणी है जिसमें एक या अधिक सरणियाँ होती हैं। यह केवल यह देखने के लिए जांचता है कि क्या इसमें शून्य की कुंजी वाला तत्व है।
क्रैगमोनीकी

-1

मूल 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 सेकंड का समय लिया"

सौजन्य: रुच हाकेश



-3
is_array($arr[key($arr)]); 

कोई छोरों, सादा और सरल।

सहयोगी सरणियों के साथ भी काम करता है न केवल संख्यात्मक सरणियों, जिसमें 0 शामिल नहीं हो सकता है (जैसे पिछले उदाहरण में आपको एक चेतावनी फेंकनी होगी यदि सरणी में 0. नहीं है)


कुंजी पर एक सरणी का पता नहीं लगाया जा सकता है, आपको मान की जांच करनी होगी
रोबो टामर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.