- অ্যারেটি আদিম মানের একটি ফ্ল্যাট অ্যারে বা এটি বহুমাত্রিক অ্যারে কিনা তা যাচাই করার সবচেয়ে কার্যকর উপায় কী ?
- আসলে কোনও অ্যারের মাধ্যমে লুপিং করা এবং এর
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
পিএইচপি ৪.২.০ এ যুক্ত হয়েছিল। থেকে পিএইচপি ডক্স :
Alচ্ছিক মোডের প্যারামিটারটি COUNT_RECURSIVE (বা 1) এ সেট করা থাকলে গণনা () পুনরাবৃত্তভাবে অ্যারে গণনা করবে। এটি একটি বহুমাত্রিক অ্যারের সমস্ত উপাদান গণনা করার জন্য বিশেষভাবে কার্যকর। গণনা () অসীম পুনরাবৃত্তি সনাক্ত করে না।
তবে এই পদ্ধতিটি সনাক্ত করে না array(array())
।
পিএইচপি ৪.২.০ বা আরও নতুনের জন্য:
function is_multi($array) {
return (count($array) != count($array, 1));
}
array(array())
বা array(array(), array())
পারেন। সাধারণত, যদি কোনও অভ্যন্তরীণ অ্যারে খালি থাকে তবে পুনরাবৃত্ত গণনাটি এর জন্য সঠিকভাবে 0 যুক্ত করবে, সুতরাং এটি সাধারণ গণনার সাথে মেলে।
আমি মনে করি এটি সর্বাধিক সোজা এগিয়ে যাওয়ার উপায় এবং এটি অত্যাধুনিক state
function is_multidimensional(array $array) {
return count($array) !== count($array, COUNT_RECURSIVE);
}
আপনি কেবল এটি কার্যকর করতে পারেন:
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))
!==
দেখার জন্য ব্যবহৃত হয় সাব লেভেলের অস্তিত্ব রয়েছে। তত্ত্বগুলির জন্য যারা সম্ভবত অনুরূপ কিছু খুঁজছেন ... ইত্যাদি।
!==
আপনি 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;
পিএইচপি 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));
যদি এটির একটি একক মাত্রার অ্যারে মিথ্যা হয় তবে এটির একটি বহু মাত্রিক অ্যারেটি সত্য হলে ।
বর্তমান আপনাকে আপনার অ্যারের প্রথম উপাদান দেবে এবং পরীক্ষা করবে যে প্রথম উপাদানটি অ্যারে কিনা is_array ফাংশন দ্বারা নয় ।
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 ) );
আমার ক্ষেত্রে. আমি বিভিন্ন রকমের আজব অবস্থায় আটকে থাকি।
প্রথম কেস = 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';
}
ভিঙ্কো ভ্র্যাসালোভিককে বিশেষ ধন্যবাদ
আমি মনে করি এটি এক উত্কৃষ্ট (অন্য ব্যবহারকারীর কাছে প্রপস আমি তার ব্যবহারকারীর নাম জানি না):
static public function isMulti($array)
{
$result = array_unique(array_map("gettype",$array));
return count($result) == 1 && array_shift($result) == "array";
}
উপরের সমস্ত পদ্ধতি দ্রুত ঘূর্ণায়মানের জন্য খুব জটিল। যদি একটি অ্যারের সমতল হয়, প্রথম উপাদানটির পরীক্ষা করে কোনও আদিম যেমন ইনট, স্ট্রিং ইত্যাদি প্রদান করা উচিত যদি এটি বহুমাত্রিক হয় তবে এটি একটি অ্যারে ফিরে আসে। এক্সটেনশন দ্বারা, আপনি এই ওয়ান লাইনারটি দ্রুত এবং ঝরঝরে ব্যবহার করতে পারেন।
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_key_exists(0,$array) ) {
// multidimensional array
} else {
// not a multidimensional array
}
* কেবলমাত্র সূচকযুক্ত সেই অ্যারেগুলিতে
নেটিভ মুদ্রণ_আর ফাংশনটি একটি মানব-পঠনযোগ্য স্ট্রিং দেয়। শুধু "অ্যারে" উদাহরণগুলি গণনা করুন।
চেষ্টা করুন ...
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 সেকেন্ড সময় নিয়েছে"
সৌজন্যে: রুচ হকোদেশ