- Apa cara paling efisien untuk memeriksa apakah sebuah array adalah array datar dari nilai primitif atau apakah itu adalah array multidimensi ?
- Apakah ada cara untuk melakukan ini tanpa benar-benar melakukan perulangan melalui array dan menjalankan
is_array()
setiap elemennya?
140
Jawaban:
Jawaban singkatnya adalah tidak, Anda tidak dapat melakukannya tanpa setidaknya mengulang secara implisit jika 'dimensi kedua' bisa berada di mana saja. Jika harus di item pertama, Anda tinggal melakukannya
is_array($arr[0]);
Tapi, cara umum paling efisien yang bisa saya temukan adalah dengan menggunakan loop foreach pada array, shortcircuiting setiap kali hit ditemukan (setidaknya loop implisit lebih baik daripada straight 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
Perulangan implisit, tetapi kita tidak dapat melakukan hubungan singkat segera setelah kecocokan ditemukan ...
$ 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)
sumber
is_multi()
mengoptimalkan kode dengan melakukanreturn count($rv)>0
Gunakan count () dua kali; satu kali dalam mode default dan satu kali dalam mode rekursif. Jika nilainya cocok, array tersebut tidak multidimensi, karena array multidimensi akan memiliki jumlah rekursif yang lebih tinggi.
if (count($array) == count($array, COUNT_RECURSIVE)) { echo 'array is not multidimensional'; } else { echo 'array is multidimensional'; }
Nilai kedua opsi
mode
ini ditambahkan di PHP 4.2.0. Dari Dokumen PHP :Namun metode ini tidak mendeteksi
array(array())
.sumber
Untuk PHP 4.2.0 atau yang lebih baru:
function is_multi($array) { return (count($array) != count($array, 1)); }
sumber
array(array())
atauarray(array(), array())
keduanya. Secara umum, jika array dalam kosong maka hitungan rekursif akan menambahkan 0 dengan benar untuk itu, sehingga membuatnya cocok dengan hitungan normal.Saya pikir ini adalah cara yang paling lurus ke depan dan canggih:
function is_multidimensional(array $array) { return count($array) !== count($array, COUNT_RECURSIVE); }
sumber
Anda cukup menjalankan ini:
if (count($myarray) !== count($myarray, COUNT_RECURSIVE)) return true; else return false;
Jika parameter mode opsional disetel ke
COUNT_RECURSIVE
(atau 1), count () akan menghitung larik secara rekursif. Ini sangat berguna untuk menghitung semua elemen dari array multidimensi.Jika sama, berarti tidak ada sublevel di mana pun. Mudah dan cepat!
sumber
if(count($tasks_by_date) !== count($tasks_by_date, 1))
!==
digunakan untuk melihat ada sub level. Untuk teori yang mungkin mencari sesuatu yang serupa ... dll.!==
Anda bisa memeriksa
is_array()
elemen pertama, dengan asumsi bahwa jika elemen pertama dari sebuah array adalah sebuah array, maka sisanya juga.sumber
if( is_array(current($arr)) ) { // is multidimensional }
Semua jawaban bagus ... inilah tiga baris saya yang selalu saya gunakan
function isMultiArray($a){ foreach($a as $v) if(is_array($v)) return TRUE; return FALSE; }
sumber
Fungsi ini akan mengembalikan jumlah int dari dimensi array (dicuri dari sini ).
function countdim($array) { if (is_array(reset($array))) $return = countdim(reset($array)) + 1; else $return = 1; return $return; }
sumber
Saya rasa Anda akan menemukan bahwa fungsi ini adalah cara yang paling sederhana, paling efisien, dan tercepat.
function isMultiArray($a){ foreach($a as $v) if(is_array($v)) return TRUE; return FALSE; }
Anda bisa mengujinya seperti ini:
$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';
sumber
foreach($a as $v) is_array($v) ? return TRUE : return FALSE;
foreach($a as $v) return is_array($v) ? true : false;
Setelah PHP 7 Anda cukup melakukan:
public function is_multi(array $array):bool { return is_array($array[array_key_first($array)]); }
sumber
Anda juga dapat melakukan pemeriksaan sederhana seperti ini:
$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
sumber
Coba sebagai berikut
if (count($arrayList) != count($arrayList, COUNT_RECURSIVE)) { echo 'arrayList is multidimensional'; }else{ echo 'arrayList is no multidimensional'; }
sumber
Bahkan ini berhasil
Jika salah itu adalah larik dimensi tunggal jika benar itu adalah multi dimensi larik .
current akan memberi Anda elemen pertama dari array Anda dan memeriksa apakah elemen pertama adalah array atau bukan dengan fungsi is_array .
sumber
Jangan gunakan COUNT_RECURSIVE
klik situs ini untuk mengetahui alasannya
gunakan rsort dan kemudian gunakan isset
function is_multi_array( $arr ) { rsort( $arr ); return isset( $arr[0] ) && is_array( $arr[0] ); } //Usage var_dump( is_multi_array( $some_array ) );
sumber
Dalam kasus saya. Saya terjebak dalam berbagai kondisi aneh.
1st case =
array("data"=> "name");
2nd case =
array("data"=> array("name"=>"username","fname"=>"fname"));
Tetapi jika
data
memiliki array sebagai pengganti nilai maka fungsi sizeof () atau count () tidak berfungsi untuk kondisi ini. Kemudian saya membuat fungsi khusus untuk diperiksa.Jika indeks pertama dari array memiliki nilai maka itu mengembalikan "hanya nilai"
Tetapi jika indeks memiliki array daripada nilai maka itu mengembalikan "memiliki array"
Saya menggunakan cara ini
function is_multi($a) { foreach ($a as $v) { if (is_array($v)) { return "has array"; break; } break; } return 'only value'; }
Terima kasih khusus kepada Vinko Vrsalovic
sumber
Saya pikir yang ini berkelas (alat peraga untuk pengguna lain, saya tidak tahu nama penggunanya):
static public function isMulti($array) { $result = array_unique(array_map("gettype",$array)); return count($result) == 1 && array_shift($result) == "array"; }
sumber
Semua metode di atas terlalu rumit untuk diluncurkan dengan cepat. Jika sebuah array datar, pengujian elemen pertama harus mengembalikan primitif misalnya int, string dll. Jika multidimensi, ia harus mengembalikan sebuah array. Dengan ekstensi, Anda bisa menggunakan liner yang satu ini dengan cepat dan rapi.
echo is_array(array_shift($myArray));
jika ini mengembalikan nilai true, array tersebut multidimensi. Lain itu datar. Sebagai catatan, sangat jarang array memiliki dimensi yang berbeda, misalnya jika Anda menghasilkan data dari model, ia akan selalu memiliki jenis struktur multidimensi atau datar yang sama yang dapat dilintasi oleh loop. Jika tidak, maka Anda telah membuatnya sendiri dengan tangan, yang berarti Anda tahu di mana semuanya akan berada dan itu hanya berfungsi tanpa perlu menulis algoritma perulangan
sumber
array_shift()
, karena ini menghapus elemen pertama dan juga menyetel ulang kunci numerik! Lebih baik gunakancurrent()
jika masih gatal karena satu liner.Selain jawaban sebelumnya dan bergantung pada skema larik yang ingin Anda periksa:
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; }
sumber
Sesederhana itu
$isMulti = !empty(array_filter($array, function($e) { return is_array($e); }));
sumber
$is_multi_array = array_reduce(array_keys($arr), function ($carry, $key) use ($arr) { return $carry && is_array($arr[$key]); }, true);
Ini satu liner yang bagus. Ini mengulangi setiap kunci untuk memeriksa apakah nilai pada kunci itu adalah sebuah array. Ini akan memastikan kebenaran
sumber
if($array[0]){ //enter your code }
sumber
if (isset($array[0])) { }
. Jika Anda yakin indeks array mulai dari 0if ( array_key_exists(0,$array) ) { // multidimensional array } else { // not a multidimensional array }
* hanya untuk larik dengan indeks numerik
sumber
Fungsi print_r asli mengembalikan string yang bisa dibaca manusia. Hitung saja contoh "Array".
mencoba...
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)
Di kotak saya, "is_multi membutuhkan 0,83681297302246 detik dalam 500000 kali"
Sumber: Ruach HaKodesh
sumber
function isMultiArray(array $value) { return is_array(reset($value)); }
sumber
Tanpa loop, polos dan sederhana.
Berfungsi juga dengan array asosiasi tidak hanya array numerik, yang tidak bisa berisi 0 (seperti dalam contoh sebelumnya akan memberi Anda peringatan jika array tidak memiliki 0.)
sumber