- यह जांचने के लिए सबसे प्रभावी तरीका है कि क्या एक सरणी आदिम मूल्यों का एक फ्लैट सरणी है या यदि यह एक बहुआयामी सरणी है ?
- क्या वास्तव में एक सरणी के माध्यम से लूपिंग और
is_array()
इसके प्रत्येक तत्व पर चलने के बिना ऐसा करने का कोई तरीका है ?
is_array()
इसके प्रत्येक तत्व पर चलने के बिना ऐसा करने का कोई तरीका है ?जवाबों:
संक्षिप्त उत्तर यह है कि आप इसे कम से कम लूपिंग के बिना नहीं कर सकते, यदि 'दूसरा आयाम' कहीं भी हो। यदि यह पहले आइटम में होना है, तो आप बस करेंगे
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)
is_multi()
में कोड का अनुकूलन करकेreturn count($rv)>0
गणना का उपयोग करें () दो बार; डिफ़ॉल्ट मोड में एक बार और पुनरावर्ती मोड में एक समय। यदि मान मेल खाते हैं, तो सरणी बहुआयामी नहीं है , क्योंकि बहुआयामी सरणी में एक उच्च पुनरावर्ती गिनती होगी।
if (count($array) == count($array, COUNT_RECURSIVE))
{
echo 'array is not multidimensional';
}
else
{
echo 'array is multidimensional';
}
यह विकल्प दूसरी वैल्यू mode
PHP 4.2.0 में जोड़ा गया था। से पीएचपी डॉक्स :
यदि वैकल्पिक मोड पैरामीटर COUNT_RECURSIVE (या 1) पर सेट है, तो काउंट () पुनरावर्ती रूप से सरणी की गणना करेगा। यह एक बहुआयामी सरणी के सभी तत्वों की गिनती के लिए विशेष रूप से उपयोगी है। गिनती () अनंत पुनरावृत्ति का पता नहीं लगाती है।
हालाँकि इस विधि का पता नहीं चलता है array(array())
।
PHP 4.2.0 या नए के लिए:
function is_multi($array) {
return (count($array) != count($array, 1));
}
array(array())
या array(array(), array())
तो काम नहीं कर रहा है । आम तौर पर, यदि कोई अंदर का सरणी खाली होता है, तो पुनरावर्ती गिनती इसके लिए ठीक से 0 जोड़ देगा, इस प्रकार यह सामान्य गिनती से मेल खाती है।
आप बस इसे निष्पादित कर सकते हैं:
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))
!==
देखने के लिए इस्तेमाल किया गया था उप स्तर मौजूद है। सिद्धांतों के लिए जो कुछ इसी तरह की तलाश में हो सकते हैं ... आदि।
!==
आप is_array()
पहले तत्व को देख सकते हैं , इस धारणा के तहत कि यदि किसी सरणी का पहला तत्व एक सरणी है, तो उनमें से बाकी भी हैं।
if( is_array(current($arr)) ) { // is multidimensional }
यह फ़ंक्शन सरणी आयामों ( यहां से चोरी ) की संख्या को वापस लौटा देगा ।
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';
foreach($a as $v) is_array($v) ? return TRUE : return FALSE;
foreach($a as $v) return is_array($v) ? true : false;
PHP 7 के बाद आप बस कर सकते हैं:
public function is_multi(array $array):bool
{
return is_array($array[array_key_first($array)]);
}
आप इस तरह से एक साधारण जाँच भी कर सकते हैं:
$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';
}
यहां तक कि यह काम करता है
is_array(current($array));
यदि इसका एकल आयाम सरणी असत्य है यदि सही इसका बहु आयाम सरणी है।
करंट आपको आपके एरे का पहला एलीमेंट देगा और यह चेक करेगा कि पहला एलीमेंट किसी अरेंज फंक्शन का है या नहीं ।
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 ) );
मेरे मामले में। मैं अजीब स्थिति में फंस गया।
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 के लिए विशेष धन्यवाद
मुझे लगता है कि यह एक उत्तम दर्जे का है (किसी अन्य उपयोगकर्ता के लिए मैं उसके उपयोगकर्ता नाम नहीं जानता):
static public function isMulti($array)
{
$result = array_unique(array_map("gettype",$array));
return count($result) == 1 && array_shift($result) == "array";
}
उपरोक्त सभी विधियाँ त्वरित रोलिंग के लिए बहुत जटिल हैं। यदि कोई सरणी समतल है, तो पहले तत्व का परीक्षण एक आदिम उदाहरण जैसे int, string आदि को लौटाना चाहिए। यदि यह बहुआयामी है, तो इसे एक सरणी लौटना चाहिए। विस्तार से, आप इस एक लाइनर का उपयोग तेज और साफ कर सकते हैं।
echo is_array(array_shift($myArray));
यदि यह सही है, तो सरणी बहुआयामी है। और यह समतल है। बस ध्यान दें, सरणियों के विभिन्न आयामों के लिए यह बहुत दुर्लभ है जैसे यदि आप किसी मॉडल से डेटा उत्पन्न कर रहे हैं, तो इसमें हमेशा एक ही प्रकार के बहुआयामी या सपाट संरचना होगी जो लूप द्वारा ट्रैवर्स की जा सकती है। यदि ऐसा नहीं है, तो आपने कस्टम को हाथ से बनाया है, जिसका अर्थ है कि आप जानते हैं कि सब कुछ कहां होगा और यह सिर्फ लूपिंग एल्गोरिदम लिखने की आवश्यकता के बिना काम करता है
array_shift()
, क्योंकि यह पहला तत्व निकालता है और संख्यात्मक कुंजियों को भी रीसेट करता है! current()
एक लाइनर के लिए अभी भी खुजली हो तो बेहतर उपयोग करें ।
पिछले उत्तरों के अलावा और उस सरणी के स्कीमा पर निर्भर करता है जिसे आप जांचना चाहते हैं:
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;
}
इसके रूप में सरल है
$isMulti = !empty(array_filter($array, function($e) {
return is_array($e);
}));
if($array[0]){
//enter your code
}
if (isset($array[0])) { }
। यदि आप सुनिश्चित हैं कि सरणी के
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 ने 500000 बार में 0.83681297302246 सेकंड का समय लिया"
सौजन्य: रुच हाकेश
function isMultiArray(array $value)
{
return is_array(reset($value));
}
is_array($arr[key($arr)]);
कोई छोरों, सादा और सरल।
सहयोगी सरणियों के साथ भी काम करता है न केवल संख्यात्मक सरणियों, जिसमें 0 शामिल नहीं हो सकता है (जैसे पिछले उदाहरण में आपको एक चेतावनी फेंकनी होगी यदि सरणी में 0. नहीं है)