পূর্বাভাসের জন্য অবৈধ যুক্তি সরবরাহ করা ()


304

এটি প্রায়শই আমার সাথে ডেটা পরিচালনা করতে হয় যা কোনও অ্যারে বা নাল ভেরিয়েবল হতে পারে এবং foreachএই ডেটা দিয়ে কিছু খাওয়ানো ।

$values = get_values();

foreach ($values as $value){
  ...
}

যখন আপনি কোনও অ্যারে নয় এমন ডেটা দিয়ে একটি ফোরচ খাওয়ান, আপনি একটি সতর্কতা পান:

সতর্কতা: [...] এ ফোরচ () এর জন্য অবৈধ যুক্তি সরবরাহ করা হয়েছে

ধরে নিই get_values()ফাংশনটি সর্বদা একটি অ্যারে (পশ্চাদপদ সামঞ্জস্যতা, উপলভ্য উত্স কোড নয়, অন্য যে কোনও কারণ নেই) ফেরানোর জন্য রিফ্যাক্টর করা সম্ভব নয় , আমি ভাবছি যে এই সতর্কতাগুলি এড়াতে সবচেয়ে পরিষ্কার এবং সবচেয়ে কার্যকর উপায় কোনটি:

  • $valuesঅ্যারেতে কাস্টিং
  • $valuesঅ্যারেতে শুরু করা হচ্ছে
  • foreachএকটি দিয়ে মোড়ানোif
  • অন্যান্য (দয়া করে পরামর্শ দিন)

এটি অত্যন্ত সম্ভব এটি $valuesকোনও অ্যারে নয়।
ভার্গব নানেকালভা

উত্তর:


509

ব্যক্তিগতভাবে আমি এটি সবচেয়ে পরিচ্ছন্ন বলে মনে করি - এটি সবচেয়ে দক্ষ, মাইন্ড কিনা তা নিশ্চিত নই!

if (is_array($values) || is_object($values))
{
    foreach ($values as $value)
    {
        ...
    }
}

আমার পছন্দের কারণ হ'ল যখন কোনওভাবেই আপনার আর কিছু শুরু না হওয়ার পরে এটি খালি অ্যারে বরাদ্দ করে না।


4
অথবা অ্যারেটি খালি নেই কিনা তা বের করতে গণনা () ব্যবহার করুন
কেমো

76
@ কেমো: count()নির্ভরযোগ্য নয়। আপনি পাস যদি count()নাল, এটা ফেরৎ 0. আপনি এটা পাস যদি একটি অ নাল, অ-বিন্যাস যুক্তি, এটা ফেরৎ 1. অতএব এটি ব্যবহার করতে অসম্ভব count(), যখন পরিবর্তনশীল একটি খালি অ্যারে হতে পারে যদি পরিবর্তনশীল একটি অ্যারে নির্ধারণ বা 1 টি আইটেমযুক্ত একটি অ্যারে।
অ্যান্ডি শেলাম

12
মনে রাখবেন যে কিছু বস্তু পুনরাবৃত্তিযোগ্য এবং এই উত্তরটি সেগুলির জন্য অ্যাকাউন্ট করে না।
ব্র্যাড কোচ

32
হওয়া উচিত if (is_array($values) || $values instanceof Traversable)
বব স্টেইন

3
এটি একটি লজ্জার বিষয় যে তিনি এ কথাটি বলে যাননি যে এটি সবচেয়ে কার্যকর হিসাবে নিশ্চিত নয়, যদিও: ডি
গুই প্রে

116

এটা কেমন? অনেক ক্লিনার এবং সমস্ত একক লাইনে।

foreach ((array) $items as $item) {
 // ...
 }

7
এটিই আমার পক্ষে কাজ করেছে। কোনও কারণে, পিএইচপি বিশ্বাস করল না যে আমি যে বহুমাত্রিক অ্যারেটি তৈরি করেছি তা আসলে অ্যারের অ্যারে ছিল।
জাস্টিন

1
এখানে একইভাবে, এটি অ্যারে বা নাল মানগুলি সমন্বিত একটি অ্যারের জন্য খুব সুন্দর ফিক্স। যদি ডেটা শূন্য থাকে তবে চালিয়ে যাওয়ার জন্য foreach লুপটিতে কেবল একটি পরীক্ষা যুক্ত করুন।
Lizardx

আমার সমস্যার সমাধান। ধন্যবাদ!
हितেশ

1
উজ্জ্বল কোড, যদি অ্যারে এবং নন-অ্যারে মানের জন্য box _POST ব্যবহার করে চেকবক্স ব্যবহার না করে, যদি বাদ পড়ে!
ইয়ান চাবোট

2
দ্রষ্টব্য: সুন্দর দেখায় এবং অবৈধ foreach সতর্কতা সমাধান করার সময়, ভেরিয়েবলটি কোনওভাবে সেট না করা থাকলে এই পদ্ধতিটি একটি অনির্ধারিত পরিবর্তনশীল সতর্কতা ফিরিয়ে দেবে। ব্যবহারের isset()বা is_array()বা উভয় সম্পূর্ণরূপে আপনার দৃশ্যকল্প ইত্যাদি উপর নির্ভর করে
জেমস

42

আমি সাধারণত এটির মতো একটি নির্মাণ ব্যবহার করি:

/**
 * Determine if a variable is iterable. i.e. can be used to loop over.
 *
 * @return bool
 */
function is_iterable($var)
{
    return $var !== null 
        && (is_array($var) 
            || $var instanceof Traversable 
            || $var instanceof Iterator 
            || $var instanceof IteratorAggregate
            );
}

$values = get_values();

if (is_iterable($values))
{
    foreach ($values as $value)
    {
        // do stuff...
    }
}

মনে রাখবেন যে এই নির্দিষ্ট সংস্করণটি পরীক্ষা করা হয়নি, এটি মেমরি থেকে সরাসরি এসওতে টাইপ করা হয়।

সম্পাদনা করুন: ট্র্যাভারেবল চেক যোগ করা হয়েছে


3
সেরা উত্তর. আমি মনে করি বাদে আপনার সত্যিকারের পরীক্ষা করা উচিত কিনা $var instanceof Traversableএখানে দেখুন । কারণ উদাহরণস্বরূপ আপনি একটি সিম্পল এক্সএমলেমেন্টের ভবিষ্যদ্বাণী করতে পারেন , তবে এটি আইট্রেটর বা আইট্রেটার অগ্রিগ্রেটের কোনও উদাহরণ নয়।
বব স্টেইন

2
আপনি অন্য দুটি ক্লাস, ক্রিসকে অপসারণ করতে সক্ষম হতে পারেন। তারা উভয়ই এখন ট্র্যাভারেবলকে প্রসারিত করে এবং মনে হয় 5.0.0 তে সেভাবেই জন্মগ্রহণ করেছে। যদিও আমি উদাহরণটি সর্বদা প্রসারিত হয় কিনা তা সম্পর্কে একটি ক্ষুদ্র সন্দেহ অনুভব করছি।
বব স্টেইন

1
@ ববস্টাইন-ভিসিবোন: হ্যাঁ (সেগুলি ব্যতীত ইন্টারফেস নয়, ক্লাস নয়) তবে; আমি এগুলির আগে ট্র্যাভারেবল রেখেছি, আইট্রেটর বা আইট্রেটার অগ্রিগ্রেটের কোনওটিরই কখনও যাচাইকরণের প্রয়োজন হবে না (এইভাবে তারা কার্যকরকরণকে ধীর করবে না)। আমি যে উত্তরটি দিয়েছি তার উত্তর যথাসম্ভব কাছাকাছি রাখতে এবং এটিকে স্পষ্ট / পঠনযোগ্য রাখতে আমি এগুলিতে রেখে দিয়েছি।
ক্রিস

2
আমি মনে করি এটি is_object($var)পুনরায় যুক্ত করা ঠিক হবে । php.net/manual/en/language.oop5.iteration.php
মার্ক ফক্স

1
@ মার্কফক্স: নির্দ্বিধায়, তবে আমি ইচ্ছাকৃতভাবে এটিকে ছেড়ে দিয়েছি; আমি এর জন্য এমন ব্যবহার কখনও দেখিনি যা প্রয়োগের মাধ্যমে ভালভাবে পরিবেশন করা হয়নি Iteratorবা IteratorAggregate, তবে এটি অবশ্যই আমার মতামত এবং এর জন্য বিষয়গত (আমি কখনই পাবলিক ফিল্ড ব্যবহার করি না)।
ক্রিস

15

সমাধান হিসাবে কাস্টিংয়ের উপর নির্ভর করবেন না , যদিও অন্যরা এটিকে ত্রুটি প্রতিরোধের জন্য বৈধ বিকল্প হিসাবে প্রস্তাব দিচ্ছে, এটি অন্য কোনও কারণ হতে পারে।

সচেতন হন: আপনি যদি সুনির্দিষ্ট কোনও ফর্মটি প্রত্যাবর্তনের প্রত্যাশা করেন তবে এটি আপনাকে ব্যর্থ করতে পারে। তার জন্য আরও চেক প্রয়োজন।

উদাহরণস্বরূপ একটি অ্যারেতে বুলিয়ান (array)bool, ালাইয়ের ফলে খালি অ্যারে তৈরি হবে না , তবে কোনও উপাদান হিসাবে একটি উপাদান রয়েছে যার মধ্যে বুলিয়ান মান রয়েছে: [0=>0]বা [0=>1]

আমি এই সমস্যাটি উপস্থাপনের জন্য একটি দ্রুত পরীক্ষা লিখেছি । ( প্রথম পরীক্ষার url ব্যর্থ হলে এখানে একটি ব্যাকআপ পরীক্ষা দেওয়া হবে))

: এর জন্য পরীক্ষার অন্তর্ভুক্ত হয় null, false, true, একটি class, একটি arrayএবং undefined


আপনার ইনপুটটিকে পূর্বাঞ্চে ব্যবহারের আগে সর্বদা পরীক্ষা করুন। পরামর্শ:

  1. দ্রুত প্রকারের পরীক্ষা করা :$array = is_array($var) or is_object($var) ? $var : [] ;
  2. পূর্বাঞ্চ ব্যবহার করে এবং রিটার্নের ধরণ উল্লেখ করার আগে পদ্ধতিগুলিতে হিন্টিং অ্যারে টাইপ করুন
  3. Within
  4. try{}catch(){}ব্লক ব্যবহার করে
  5. উত্পাদন প্রকাশের আগে সঠিক কোড / পরীক্ষার নকশা করা
  6. সঠিক ফর্মের বিরুদ্ধে অ্যারে পরীক্ষা করতে আপনি array_key_existsএকটি নির্দিষ্ট কী ব্যবহার করতে পারেন বা কোনও অ্যারের গভীরতা পরীক্ষা করতে পারেন (যখন এটি এক হয়!)
  7. সদৃশ কোড হ্রাস করার জন্য সর্বদা আপনার সহায়ক পদ্ধতিগুলি বিশ্বব্যাপী নেমস্পেসে উত্তোলন করুন

8

এটা চেষ্টা কর:

//Force array
$dataArr = is_array($dataArr) ? $dataArr : array($dataArr);
foreach ($dataArr as $val) {
  echo $val;
}

;)


1
এটি মিশুক অ্যারেগুলির সাথে ভালভাবে কাজ করবে না .. is_array পদ্ধতিটি সামগ্রিকভাবে উন্নত ... এবং সহজ ...
এও_

4
$values = get_values();

foreach ((array) $values as $value){
  ...
}

সমস্যা সর্বদা নাল এবং কাস্টিং আসলে পরিস্কার সমাধান।


3

প্রথমত, প্রতিটি ভেরিয়েবলকে আরম্ভ করতে হবে। সর্বদা.
Ingালাই কোনও বিকল্প নয়।
যদি get_values ​​(); বিভিন্ন ধরণের ভেরিয়েবল ফিরিয়ে দিতে পারে, অবশ্যই এই মানটি অবশ্যই পরীক্ষা করা উচিত।


Ingালাই একটি বিকল্প - আপনি যদি একটি অ্যারে ব্যবহার করে আরম্ভ করে থাকেন তবে $array = (array)null;খালি অ্যারে পান। অবশ্যই এটি মেমরির বরাদ্দের অপচয় ;-)
অ্যান্ডি শেলাম

2
+1: একটি সংবেদনশীল দৃষ্টিকোণ থেকে পড়ুন, ভাষাটি ভাষা ছাড়া করতে পারে কিনা সেদিকে আমার খেয়াল নেই, ভেরিয়েবলগুলি অবশ্যই ঘোষণা করা উচিত এবং অবিশ্বাস্য ফলাফল অবশ্যই পরীক্ষা করা উচিত। এটি বিকাশকারীদের বুদ্ধিমান এবং ত্রুটিযুক্ত লগগুলি ছোট রাখার প্রয়োজন।
ক্রিস

3

@ ক্রিসের কোডটির আরও সংক্ষিপ্ত বর্ধন

function secure_iterable($var)
{
    return is_iterable($var) ? $var : array();
}

foreach (secure_iterable($values) as $value)
{
     //do stuff...
}

বিশেষত টেমপ্লেট কোড ব্যবহার করার জন্য

<?php foreach (secure_iterable($values) as $value): ?>
    ...
<?php endforeach; ?>

2
মানে না return is_iterable($var) ? $var : array($var);?
এসকিউবি

3

আপনি যদি পিএইচপি 7 ব্যবহার করেন এবং আপনি কেবল অপরিজ্ঞাত ত্রুটিগুলি পরিচালনা করতে চান তবে এটিই সবচেয়ে পরিষ্কার আইএমএইচও

$array = [1,2,3,4];
foreach ( $array ?? [] as $item ) {
  echo $item;
}

2
foreach ($arr ? $arr : [] as $elem) {
    // Does something 
}

এটি অ্যারে কিনা তা যাচাই করে না তবে ভেরিয়েবলটি নাল বা ফাঁকা অ্যারে থাকলে লুপটি এড়িয়ে যায়।


1

আমি এটি নিশ্চিত কিনা তা নিশ্চিত না তবে ওয়ার্ডপ্রেস সাইটগুলি স্থানান্তরিত করার সময় বা সাধারণভাবে গতিশীল সাইটগুলি স্থানান্তরিত করার সময় এই সমস্যাটি বেশ কয়েকবার ঘটেছিল বলে মনে হয়। যদি এটি হয় তবে নিশ্চিত হয়ে নিন যে আপনি যে হোস্টিংটি পুরানো সাইটটি ব্যবহার করছেন সেই একই পিএইচপি সংস্করণ ব্যবহার করে mig

আপনি যদি নিজের সাইট মাইগ্রেশন না করে থাকেন এবং এটি কেবলমাত্র একটি সমস্যা যা পিএইচপি 5 এ আপডেট করার চেষ্টা করেছে try এটি এই সমস্যার কিছুটির যত্ন নেয়। একটি নির্বোধ সমাধান মত মনে হতে পারে কিন্তু আমার জন্য কৌতুক।


1

আপনি যদি ফোরচ লুপের ভিতরে অ্যারে সেট করে থাকেন তবে এই বিজ্ঞপ্তির ব্যতিক্রমী কেসটি ঘটে

if (is_array($values))
{
    foreach ($values as $value)
    {
        $values = null;//WARNING!!!
    }
}

1

এই সমাধান সম্পর্কে কীভাবে:

$type = gettype($your_iteratable);
$types = array(
    'array',
    'object'
);

if (in_array($type, $types)) {
    // foreach code comes here
}

1

সতর্কতা অবৈধ যুক্তি foreach()প্রদর্শন প্রদর্শনের জন্য সরবরাহ করা হয়েছে । যাও /wp-content/plugins/display-tweets-php। তারপরে 591 লাইন নম্বরটিতে এই কোডটি প্রবেশ করান, এটি পুরোপুরি চলবে।

if (is_array($tweets)) {
    foreach ($tweets as $tweet) 
    {
        ...
    }
}

অসাধারণ! এটি গ্রহণযোগ্য সমাধান হওয়া উচিত। আমার ক্ষেত্রে আমি এটি যুক্ত করেছি:if (is_array($_POST['auto'])){ // code }
জোডিশপ

0

পরিবেশের সাথে একটি সম্পর্কও রয়েছে বলে মনে হয়:

আমার কাছে সেই "অবৈধ যুক্তি সরবরাহিত ফোরচ ()" ত্রুটিটি কেবলমাত্র পরিবেশ পরিবেশে ছিল, তবে প্রোডে নয় (আমি সার্ভারে কাজ করছি, লোকালহোস্ট নয়)।

ত্রুটি সত্ত্বেও একটি var_dump ইঙ্গিত করেছিল যে অ্যারেটি ভাল ছিল (উভয় ক্ষেত্রে অ্যাপ্লিকেশন এবং ডেভ)।

if (is_array($array))প্রায় foreach ($array as $subarray)সমস্যার সমাধান।

দুঃখিত, আমি কারণটি ব্যাখ্যা করতে পারছি না, তবে সমাধান হিসাবে সমাধান করতে আমার কিছুটা সময় লেগেছিল বলে আমি এটিকে পর্যবেক্ষণ হিসাবে আরও ভাল করে ভাগ করে নেওয়ার কথা ভেবেছিলাম।


0

যখন আপনি লুপটি পূর্বাভাসে অ্যারে পাস করবেন তখন is_array ফাংশনটি ব্যবহার করুন।

if (is_array($your_variable)) {
  foreach ($your_variable as $item) {
   //your code
}
}

0

খালি যদি ফাঁকা অ্যারেটি ফ্যালব্যাক হিসাবে সংজ্ঞায়িত করা যায় get_value()?
আমি সবচেয়ে সংক্ষিপ্ততম পথটির কথা ভাবতে পারি না।

$values = get_values() ?: [];

foreach ($values as $value){
  ...
}

0

আমি সংমিশ্রণ ব্যবহার করব empty, issetএবং is_arrayযেমন

$array = ['dog', 'cat', 'lion'];

if (!empty($array) && isset($array) && is_array($array) {
    //loop
    foreach ($array as $values) {
        echo $values; 
    }
}

-3

আমি অ্যান্ডির মতো একই কাজ করব তবে আমি 'খালি' ফাংশনটি ব্যবহার করব।

তাই ভালো:

if(empty($yourArray))
{echo"<p>There's nothing in the array.....</p>";}
else
{
foreach ($yourArray as $current_array_item)
  {
    //do something with the current array item here
  } 
}

3
-1, যদি $yourArray = 1;এটি পুনরাবৃত্তি করার চেষ্টা করবে, এবং আপনি ত্রুটি পাবেন। empty()একটি উপযুক্ত পরীক্ষা নয়।
ব্র্যাড কোচ

@ ব্র্যাডকোচ একেবারে ঠিক। is_array () হ'ল পরীক্ষার একমাত্র নির্ভরযোগ্য উপায় $ yourAraray একটি অ্যারে কিনা। কেন_আররে () পর্যাপ্ত নয় - এ সম্পর্কিত বিশদগুলির জন্য অন্যান্য উত্তর দেখুন - পূর্বাচন পুনরাবৃত্তিকেও পরিচালনা করতে পারে।
cgeisel
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.