অ্যারে বহুমাত্রিক কিনা তা চেক করছেন?


137
  1. অ্যারেটি আদিম মানের একটি ফ্ল্যাট অ্যারে বা এটি বহুমাত্রিক অ্যারে কিনা তা যাচাই করার সবচেয়ে কার্যকর উপায় কী ?
  2. আসলে কোনও অ্যারের মাধ্যমে লুপিং করা এবং এর is_array()প্রতিটি উপাদানটিতে চালানো ছাড়া এটি করার কোনও উপায় আছে কি ?

9
এটি উল্লেখ করা মূল্যবান যে পিএইচপি-তে সত্যিকারের বহু-মাত্রিক অ্যারে নেই - কেবলমাত্র সহজ সংখ্যামূলক অ্যারে'র মান। সুতরাং আপনার প্রশ্নটি সত্যিই জিজ্ঞাসা করছে "আমার অ্যারেতে কোনও স্কেলারের মান নেই"?
gahooa

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
ভাল, এই সতর্কতার সাথে আমি বিশ্বাস করি যে আপনার ফিল্টারিং লাইনে অ্যারে_ম্যাপ ("is_array", $ a) থাকা উচিত, is_array কে খালি শব্দ হিসাবে ব্যবহার করা উচিত নয়।
ম্যাথু Scharley

ভাল ক্যাচ, এটি বাড়িয়ে দিয়েছে_মুলটি, তবে ফোরচ ম্যাচ করার মতো এখনও ভাল নয়
ভিঙ্কো ভার্সালভিক

2
এটি লক্ষণীয় যে লিখিত হিসাবে, বহু_3 শুধুমাত্র সূচকগুলিতে কোনও ফাঁক ছাড়াই শূন্য-ভিত্তিক অ-সমিতিগত অ্যারেগুলিতে কাজ করবে, যার অর্থ এটি এই উদাহরণগুলির কোনওটিকে বহুমাত্রিক হিসাবে সঠিকভাবে সনাক্ত করতে পারে না।
ক্রেগমনকি

ফাংশন ইন is_multi()করে কোড অপটিমাইজreturn count($rv)>0
Xorifelse

is_array (অ্যারে_ভ্যালু ($ আরআর) [0]) কাস্টমাইজড কীগুলির জন্য কাজ হিসাবে কাজ করে।
ভিজিটর রডরিগস

191

দুইবার গণনা ব্যবহার করুন; ডিফল্ট মোডে এক সময় এবং পুনরাবৃত্ত মোডে এক সময়। মানগুলি মিলে গেলে অ্যারেটি বহুমাত্রিক নয় , কারণ একটি বহুমাত্রিক অ্যারেটির একটি উচ্চতর পুনরাবৃত্তিযোগ্য গণনা থাকবে।

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

এই বিকল্পের দ্বিতীয় মানটি modeপিএইচপি ৪.২.০ এ যুক্ত হয়েছিল। থেকে পিএইচপি ডক্স :

Alচ্ছিক মোডের প্যারামিটারটি COUNT_RECURSIVE (বা 1) এ সেট করা থাকলে গণনা () পুনরাবৃত্তভাবে অ্যারে গণনা করবে। এটি একটি বহুমাত্রিক অ্যারের সমস্ত উপাদান গণনা করার জন্য বিশেষভাবে কার্যকর। গণনা () অসীম পুনরাবৃত্তি সনাক্ত করে না।

তবে এই পদ্ধতিটি সনাক্ত করে না array(array())


2
উল্লিখিত হিসাবে এটি খালি
আর্থার

30

পিএইচপি ৪.২.০ বা আরও নতুনের জন্য:

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

কাজ করছে না array(array())বা array(array(), array())পারেন। সাধারণত, যদি কোনও অভ্যন্তরীণ অ্যারে খালি থাকে তবে পুনরাবৃত্ত গণনাটি এর জন্য সঠিকভাবে 0 যুক্ত করবে, সুতরাং এটি সাধারণ গণনার সাথে মেলে।
ফ্যানিস হাটজিডাকিস

13

আমি মনে করি এটি সর্বাধিক সোজা এগিয়ে যাওয়ার উপায় এবং এটি অত্যাধুনিক state

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;

Alচ্ছিক মোড প্যারামিটারটি COUNT_RECURSIVE(বা 1) এ সেট করা থাকলে গণনা () পুনরাবৃত্তভাবে অ্যারে গণনা করবে। এটি একটি বহুমাত্রিক অ্যারের সমস্ত উপাদান গণনা করার জন্য বিশেষভাবে কার্যকর।

যদি এটি একই হয়, মানে কোথাও কোনও সাবলেভেল নেই। সহজ এবং দ্রুত!


ধন্যবাদ ... সহায়ক। আমি দেখতে চেয়েছিলাম যে আমার অ্যারেতে একটি সাব লেভেল রয়েছে, আমি ব্যবহার করেছিif(count($tasks_by_date) !== count($tasks_by_date, 1))
মাইক বারউইক

কুল। COUPRECURSIVE বা 1 গণনার জন্য সমান ()
পিয়ান_ম 4n

একেবারে। আমি ঠিক কম বিশৃঙ্খলা পছন্দ করি এবং এটি !==দেখার জন্য ব্যবহৃত হয় সাব লেভেলের অস্তিত্ব রয়েছে। তত্ত্বগুলির জন্য যারা সম্ভবত অনুরূপ কিছু খুঁজছেন ... ইত্যাদি।
মাইক বারউইক

আপনি যা পেয়েছিলেন তা আমার পক্ষে সত্য হয়ে !==
উঠেনি

খালি অ্যারে সহ, ব্যর্থ হয়েছে
ওয়ালেস ম্যাক্সটার

7

আপনি is_array()এই অনুমানের অধীনে প্রথম উপাদানটি পরীক্ষা করে দেখতে পারেন যে যদি অ্যারের প্রথম উপাদানটি একটি অ্যারে হয় তবে তার বাকি অংশগুলিও খুব বেশি।


এটি আসলে একটি ভাল পয়েন্ট। আমার বিশেষ ক্ষেত্রে এটি যেহেতু / বা পরিস্থিতি হ'ল আমি মূল অ্যারের তৈরিটি নিয়ন্ত্রণ করছি। আমি এখনই প্রশ্নটি খোলা রাখব যদি এমন কোনও সমাধান হয় যা সাধারণত কার্যকরভাবে কাজ করতে পারে।
উইলকো

5
if( is_array(current($arr)) ) { // is multidimensional }
এটির

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

এটি কেবল গ্রেগের ক্ষেত্রে কাজ করবে। এটি সমস্যার সাধারণ সমাধান নয় যেখানে দ্বিতীয় মাত্রা অ্যারেতে যে কোনও জায়গায় হতে পারে
ভিঙ্কো ভার্সালোভিক

$ অ্যারে = অ্যারে ("হ্যালো", "হাই" => "হাই সেখানে"); $ আরআর [] = & আরআর; //
ওফস

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

পিএইচপি 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));

যদি এটির একটি একক মাত্রার অ্যারে মিথ্যা হয় তবে এটির একটি বহু মাত্রিক অ্যারেটি সত্য হলে ।

বর্তমান আপনাকে আপনার অ্যারের প্রথম উপাদান দেবে এবং পরীক্ষা করবে যে প্রথম উপাদানটি অ্যারে কিনা is_array ফাংশন দ্বারা নয় ।


অন্য কোনও উপাদান বাসা বাঁধছে না তা নিশ্চিত করতে চাইলে এটি নির্ভরযোগ্য হবে না।
ভ্যানামেরোজেন

1

COUNT_RECURSIVE ব্যবহার করবেন না

কেন তা জানতে এই সাইটে ক্লিক করুন

আরএস্ট ব্যবহার করুন এবং তারপরে আইসেট ব্যবহার করুন

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

আমার ক্ষেত্রে. আমি বিভিন্ন রকমের আজব অবস্থায় আটকে থাকি।
প্রথম কেস = 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';
    }

ভিঙ্কো ভ্র্যাসালোভিককে বিশেষ ধন্যবাদ


0

আমি মনে করি এটি এক উত্কৃষ্ট (অন্য ব্যবহারকারীর কাছে প্রপস আমি তার ব্যবহারকারীর নাম জানি না):

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

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

0

উপরের সমস্ত পদ্ধতি দ্রুত ঘূর্ণায়মানের জন্য খুব জটিল। যদি একটি অ্যারের সমতল হয়, প্রথম উপাদানটির পরীক্ষা করে কোনও আদিম যেমন ইনট, স্ট্রিং ইত্যাদি প্রদান করা উচিত যদি এটি বহুমাত্রিক হয় তবে এটি একটি অ্যারে ফিরে আসে। এক্সটেনশন দ্বারা, আপনি এই ওয়ান লাইনারটি দ্রুত এবং ঝরঝরে ব্যবহার করতে পারেন।

echo is_array(array_shift($myArray));

যদি এটি সত্য হয়, অ্যারেটি বহুমাত্রিক। অন্যথায় এটি সমতল। কেবল লক্ষণীয়ভাবে, অ্যারেগুলির পক্ষে বিভিন্ন মাত্রা থাকা খুব বিরল উদাহরণস্বরূপ যদি আপনি কোনও মডেল থেকে ডেটা তৈরি করে থাকেন তবে এতে সর্বদা একই ধরণের বহুমাত্রিক বা সমতল কাঠামো থাকে যা লুপগুলি অনুসরণ করতে পারে। যন্ত্র তৈরি লুপ যদি এটি না হয়, তবে আপনি নিজের হাতে কাস্টমটি এটি হাতে তৈরি করেছেন, যার অর্থ আপনি কোথায় থাকবেন তা জানেন এবং এটি কোনও লুপিং অ্যালগরিদম লেখার প্রয়োজন ছাড়াই কাজ করে এখানে চিত্র বর্ণনা লিখুন


প্রথম কৌশলটি অ্যারে হলে এই কৌশলটি কেবলমাত্র বহুমাত্রিক অ্যারেগুলি সন্ধান করে।
ক্রেগমনকি

ব্যবহারের ক্ষেত্রে সতর্ক থাকুন array_shift(), কারণ এটি প্রথম উপাদানটি সরিয়ে দেয় এবং সংখ্যার কীগুলি পুনরায় সেট করে! current()যদি এখনও ওয়ান-লাইনারের জন্য চুলকায় তবে ভাল ব্যবহার ।
মার্সেলো মুনকিমায়ার

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

এখানে একটি দুর্দান্ত একটি লাইনার আছে। Key কীটির মানটি একটি অ্যারে কিনা তা যাচাই করার জন্য এটি প্রতিটি কীতে পুনরাবৃত্তি করে। এটি সত্য নিশ্চিত করবে


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

কমপক্ষে ব্যবহার if (isset($array[0])) { }। আপনি যদি নিশ্চিত হন যে অ্যারের সূচকগুলি 0
এস্টিস

একটি বহুমাত্রিক অ্যারে এমন এক অ্যারে যা এক বা একাধিক অ্যারে ধারণ করে। এটি কেবল শূন্যের কী সহ কোনও উপাদান রয়েছে কিনা তা পরীক্ষা করে দেখায়।
ক্রেগমনকি

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

// multidimensional array

}  else {

// not a multidimensional array

}

* কেবলমাত্র সূচকযুক্ত সেই অ্যারেগুলিতে


একটি বহুমাত্রিক অ্যারে এমন এক অ্যারে যা এক বা একাধিক অ্যারে ধারণ করে। এটি কেবল শূন্যের কী সহ কোনও উপাদান রয়েছে কিনা তা পরীক্ষা করে দেখায়।
ক্রেগমনকি

-1

নেটিভ মুদ্রণ_আর ফাংশনটি একটি মানব-পঠনযোগ্য স্ট্রিং দেয়। শুধু "অ্যারে" উদাহরণগুলি গণনা করুন।

চেষ্টা করুন ...

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)

আমার বাক্সে, "ইস_মুলটি 500000 বারে 0.83681297302246 সেকেন্ড সময় নিয়েছে"

সৌজন্যে: রুচ হকোদেশ


-2
function isMultiArray(array $value)
{
    return is_array(reset($value));
}

প্রথম পরীক্ষার উপাদানটি বহুমাত্রিক হলে এটি কেবল পরীক্ষা করে।
ক্রেগমনকি

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

সরল এবং সরল কোনও লুপ নেই।

সহযোগী অ্যারেগুলির সাথেও কাজ করে কেবল সংখ্যাযুক্ত অ্যারে নয়, যার মধ্যে 0 থাকতে পারে না (আগের উদাহরণের মতো অ্যারেতে 0 না থাকলে আপনাকে একটি সতর্কতা ছুঁড়ে ফেলবে)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.