سؤال

  1. ما هي الطريقة الأكثر فعالية للتحقق مما إذا كانت المصفوفة مجموعة مسطحة من القيم البدائية أو إذا كان مصفوفة متعددة الأبعاد?
  2. هل هناك أي طريقة للقيام بذلك دون حلق فعليًا من خلال صفيف وجري 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)

نصائح أخرى

استخدم العد () مرتين؛مرة واحدة في الوضع الافتراضي ومرة ​​واحدة في الوضع العودي.إذا كانت القيم متطابقة، فإن المصفوفة هي لا متعدد الأبعاد، حيث أن المصفوفة متعددة الأبعاد سيكون لها عدد تكراري أعلى.

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

هذا الخيار القيمة الثانية mode تمت إضافته في PHP 4.2.0.من مستندات 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;
}

ستُرجع هذه الوظيفة عددًا صحيحًا من أبعاد الصفيف (المسروقة من هنا).

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

جميع الطرق المذكورة أعلاه معقدة للغاية بحيث لا يمكن تنفيذها بسرعة.إذا كانت المصفوفة مسطحة، فإن اختبار العنصر الأول يجب أن يُرجع قيمة بدائية، على سبيل المثال int، string e.t.c.إذا كانت متعددة الأبعاد، فيجب أن تُرجع مصفوفة.بالإضافة إلى ذلك، يمكنك استخدام هذه البطانة بسرعة وأنيقة.

echo is_array(array_shift($myArray));

إذا كان هذا صحيحا، فإن المصفوفة متعددة الأبعاد.وإلا فهو مسطح.فقط للملاحظة، من النادر جدًا أن يكون للمصفوفات أبعاد مختلفة، على سبيل المثال.إذا كنت تقوم بإنشاء بيانات من نموذج، فسيكون له دائمًا نفس النوع من البنية متعددة الأبعاد أو المسطحة التي يمكن اجتيازها بواسطة الحلقات.machine made loopsإذا لم يكن الأمر كذلك، فقد قمت بتصميمه يدويًا بشكل مخصص، مما يعني أنك تعرف أين سيكون كل شيء ويعمل دون الحاجة إلى كتابة خوارزمية تكراريةenter image description here

بالإضافة إلى الإجابات السابقة واعتمادًا على مخطط المصفوفة التي تريد التحقق منها:

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

لو خطأ شنيع انه بعد واحد مصفوفة إذا حقيقي انه متعدد الأبعاد مجموعة مصفوفة.

حاضِر سيعطيك العنصر الأول من المصفوفة الخاصة بك ويتحقق مما إذا كان العنصر الأول عبارة عن مصفوفة أم لا is_array وظيفة.

في حالتي.لقد علقت في حالة غريبة مختلفة.
الحالة الأولى = array("data"=> "name");
الحالة الثانية = array("data"=> array("name"=>"username","fname"=>"fname"));
لكن اذا data يحتوي على مصفوفة بدلاً من القيمة، ثم لا تعمل الدالة sizeof() أو count() في هذا الشرط.ثم أقوم بإنشاء وظيفة مخصصة للتحقق.
إذا كان الفهرس الأول للصفيف له قيمة فإنه يُرجع "القيمة فقط"
ولكن إذا كان الفهرس يحتوي على صفيف بدلاً من القيمة فإنه يُرجع "يحتوي على صفيف"
أنا استخدم هذه الطريقة

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

شكر خاص ل فينكو فرسالوفيتش

انها بسيطة مثل

$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 0.83681297302246 ثانية في 500000 مرة"

كياسة:روتش هاكوديش

function isMultiArray(array $value)
{
    return is_array(reset($value));
}
is_array($arr[key($arr)]); 

لا توجد حلقات، واضحة وبسيطة.

يعمل أيضًا مع المصفوفات المرتبطة، وليس فقط المصفوفات الرقمية، التي لا يمكن أن تحتوي على 0 (كما في المثال السابق، قد يوجه لك تحذيرًا إذا لم يكن المصفوفة تحتوي على 0.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top