ভেরিয়েবল অ্যারে কিনা তা কীভাবে পরীক্ষা করবেন?… বা অ্যারে-জাতীয় কিছু


90

আমি foreachএকটি ভেরিয়েবলের সাথে একটি লুপ ব্যবহার করতে চাই , তবে এই ভেরিয়েবলটি বিভিন্ন ধরণের হতে পারে, NULLউদাহরণস্বরূপ।

সুতরাং foreachআমি এটি পরীক্ষা করার আগে :

if(is_array($var)){
  foreach($var as ...

তবে আমি বুঝতে পারি যে এটি এমন একটি শ্রেণিও হতে পারে যা Iteratorইন্টারফেস প্রয়োগ করে । হয়তো আমি অন্ধ কিন্তু ক্লাসটি ইন্টারফেস প্রয়োগ করে কিনা তা কীভাবে পরীক্ষা করব? is_aফাংশন বা inheritsঅপারেটর মতো কিছু আছে ? আমি খুঁজে পেয়েছি class_implements, আমি এটি ব্যবহার করতে পারি, তবে সম্ভবত আরও সহজ কিছু আছে?

এবং দ্বিতীয়, আরও গুরুত্বপূর্ণ, আমি মনে করি যে এই ফাংশনটি বিদ্যমান, ভেরিয়েবল is_arrayবা "প্রয়োগকারী Iteratorইন্টারফেস" কিনা তা পরীক্ষা করার জন্য যথেষ্ট হবে বা আরও কিছুর জন্য আমার পরীক্ষা করা উচিত?


4
যদি (ray var উদাহরণসরে অ্যারেআইটারেটর)
আলেক্সি

হ্যাঁ, আমি নিশ্চিত ছিলাম যে এটি কাজ করে না যা এমনকি ম্যানুয়ালটির
দিকেও নজর দেয়নি

উত্তর:


80

যদি আপনি foreachকোনও ফাংশনের অভ্যন্তরীণ ব্যবহার করছেন এবং আপনি কোনও অ্যারে বা ট্র্যাভারেবল অবজেক্টের প্রত্যাশা করছেন তবে আপনি সেই ফাংশনটির সাথে ইঙ্গিতটি টাইপ করতে পারেন:

function myFunction(array $a)
function myFunction(Traversable)

আপনি যদি foreachকোনও ফাংশনের অভ্যন্তরে ব্যবহার না করে থাকেন বা আপনি উভয়ই প্রত্যাশা করছেন তবে আপনি কেবল পরিবর্তনটি পুনরুক্ত করতে পারবেন কিনা তা পরীক্ষা করতে এই নির্মাণটি ব্যবহার করতে পারেন:

if (is_array($a) or ($a instanceof Traversable))

ধন্যবাদ আমি আশা করি এটি যথেষ্ট এবং এখানে পুনরুক্তি করা যায় এমন কোনও ভাষা নির্মাণ / থাকবে না।
ভোকটাস

আমি is_arrayব্যয়বহুল ছিল। গুণমানের ব্যয়টি অ্যারের আকারের সাথে বেড়েছে বলে মনে হয়েছিল (এটি কেবল অ্যারে কিনা তা যাচাই করে যা বোঝায় না)। কিন্তু একটি লাইব্রেরিতে আমার কাছে হতবাকভাবে ঘটনা ঘটেছিল। লিঙ্কিত প্রশ্নে আমার মন্তব্য দেখুন । instanceof Traversableঅ্যারে নিয়ে কাজ করবে ? আমি এর অভিনয় পরীক্ষা করার সুযোগ পেলাম না।
এডিটিসি

@ এডটিসি আফার একটি অ্যারে তাই হ্যাঁর উদাহরণ Traversable
জুতো

4
@ শো আমি এখানে চেষ্টা করেছিলাম । $var = array(1,2,3);ফলাফলগুলি সহ : is_array($var) = trueএবং $var instanceof Traversable = false
এডিটিসি

হ্যাঁ, ঠিক আছে। অ্যারে বাস্তবায়ন করে না Iteratorএবং কাজ করে কাজ করে না Traversable
জুতো

15

foreachঅ্যারে এবং অবজেক্টগুলি পরিচালনা করতে পারে। আপনি এটি দিয়ে পরীক্ষা করতে পারেন:

$can_foreach = is_array($var) || is_object($var);
if ($can_foreach) {
    foreach ($var as ...
}

আপনার Traversableউত্তরগুলিতে অন্যরা যেমন এটি ইঙ্গিত দিয়েছিল আপনাকে বিশেষভাবে যাচাই করার দরকার নেই , কারণ সমস্ত বস্তু - যেমন সমস্ত অ্যারে পিএইচপি-তে ট্র্যাভারেজেবল।

আরও প্রযুক্তিগতভাবে:

foreachসমস্ত ধরণের ট্র্যাভারেবলের সাথে কাজ করে, যেমন অ্যারেগুলির সাথে, সরল বস্তুগুলির সাথে (যেখানে অ্যাক্সেসযোগ্য বৈশিষ্ট্যগুলি ট্র্যাভার করা হয়) এবং Traversableঅবজেক্টস (বা বরং এমন বস্তু যা অভ্যন্তরীণ get_iteratorহ্যান্ডলারের সংজ্ঞা দেয় )।

( উত্স )

সাধারণ পিএইচপি প্রোগ্রামিংয়ে কেবল বলা হয়েছে, যখনই কোনও পরিবর্তনশীল

  • একটি অ্যারের
  • একটি বস্তু

এবং না

  • শূন্য
  • একটি উত্স
  • একটি স্কেলার

আপনি এটি ব্যবহার করতে পারেন foreach


5

আপনি Traversableএকটি সাধারণ ফাংশন দিয়ে উদাহরণটি পরীক্ষা করতে পারেন । এটি Iteratorকারণ এই সমস্ত জন্য কাজ করবেIterator extends Traversable

function canLoop($mixed) {
    return is_array($mixed) || $mixed instanceof Traversable ? true : false;
}

"? সত্য: মিথ্যা" অংশটি নিরর্থক। উদাহরণস্বরূপ ফলাফল হিসাবে ইতিমধ্যে একটি bool মান দেয়।
লিনাস


0

কার্যাদি

<?php

/**
 * Is Array?
 * @param mixed $x
 * @return bool
 */
function isArray($x) : bool {
  return !isAssociative($x);
}

/**
 * Is Associative Array?
 * @param mixed $x
 * @return bool
 */
function isAssociative($x) : bool {
  if (!is_array($array)) {
    return false;
  }
  $i = count($array);
  while ($i > 0) {
    if (!isset($array[--$i])) {
      return true;
    }
  }
  return false;
}

উদাহরণ

<?php

$arr = [ 'foo', 'bar' ];
$obj = [ 'foo' => 'bar' ];

var_dump(isAssociative($arr));
# bool(false)

var_dump(isAssociative($obj));
# bool(true)

var_dump(isArray($obj));
# bool(false)

var_dump(isArray($arr));
# bool(true)

0

পিএইচপি 7.1 যেহেতু iterableঠিক এই উদ্দেশ্যে একটি ছদ্ম-টাইপ রয়েছে । টাইপ-হিন্টিং iterableকোনও অ্যারে পাশাপাশি Traversableইন্টারফেসের কোনও প্রয়োগ গ্রহণ করে । পিএইচপি 7.1 এছাড়াও ফাংশন চালুis_iterable() । পুরানো সংস্করণগুলির জন্য, নতুন অন্তর্নির্মিত বৈশিষ্ট্যগুলি ছাড়াই সমমানের প্রকার প্রয়োগের জন্য এখানে অন্যান্য উত্তরগুলি দেখুন।

ফেয়ার প্লে: ব্ল্যাকহোল যেমন উল্লেখ করেছে, এই প্রশ্নটি আইটেবল অবজেক্ট এবং অ্যারের প্রকারের ইঙ্গিতের সদৃশ বলে মনে হচ্ছে ? এবং তার উত্তর আমার চেয়ে আরও বিশদে যায়।

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