একটি অগ্রণী লুপে প্রথম এবং শেষ পুনরাবৃত্তিটি কীভাবে নির্ধারণ করবেন?


494

প্রশ্নটি সহজ। foreachআমার কোডে আমার একটি লুপ রয়েছে:

foreach($array as $element) {
    //code
}

এই লুপটিতে, যখন আমরা প্রথম বা শেষ পুনরাবৃত্তিতে থাকি তখন আমি আলাদাভাবে প্রতিক্রিয়া জানাতে চাই।

এই কিভাবে করবেন?

উত্তর:


426

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

$i = 0;
$len = count($array);
foreach ($array as $item) {
    if ($i == 0) {
        // first
    } else if ($i == $len - 1) {
        // last
    }
    // …
    $i++;
}

24
আমি মনে করি না এখানে ডাউনভোটিং হওয়া উচিত কারণ এটিও সঠিকভাবে কাজ করছে এবং এখনও ব্যবহার array_shiftএবং এর মতো আবর্জনা নয় array_pop। যদিও এই সমাধানটি আমি এসেছি যদি আমাকে এমন কিছু বাস্তবায়ন করতে হত তবে আমি রোক ক্রালের উত্তরটি এখনই আটকে থাকি।
শায়ডিক্স

15
আমার যদি কাউন্টারের দরকার হয় তবে আমি ফরচের পরিবর্তে লুপের জন্য ব্যবহার করতে পছন্দ করি।
rkawano

10
আপনি যদি ব্যবহার করেন তবে আপনার $i = 1চিন্তা করার দরকার নেই $len - 1, কেবল ব্যবহার করুন $len
আকসু

2
@ তুয়ান কিভাবে পয়েন্ট # 3 ঠিক আছে? এইচটিএমএল জড়িত থেকে বা এই প্রশ্নটি মোটেই প্রাসঙ্গিক? এটি একটি পিএইচপি প্রশ্ন, স্পষ্টতই ... এবং যখন শব্দার্থবিজ্ঞানের কথাটি আসে, তখন এটি "গভীর ব্লেব্লাহ সবসময় ভালব্লাহের চেয়ে ভাল (এটি এমনকি আমার মতামতও নয়, এটি নির্ভুল সত্য)"
দেজি

1
@ আরকাওয়ানো কিন্তু আপনি লুপের জন্য ব্যবহার করলে নামযুক্ত কীটি পাবেন না
ফাহমি

1013

যদি আপনি এমন কোনও সমাধান পছন্দ করেন যা লুপের বাইরে কাউন্টারটির সূচনা প্রয়োজন না, তবে আমি বর্তমান পুনরাবৃত্তি কীটি ফাংশনের সাথে তুলনা করার প্রস্তাব দিচ্ছি যা আপনাকে অ্যারের শেষ / প্রথম কীটি বলে tells

এটি আসন্ন পিএইচপি 7.3 এর সাথে কিছুটা আরও দক্ষ (এবং আরও পঠনযোগ্য) হয়ে ওঠে।

পিএইচপি .3.৩ এবং তার বেশি সমাধান:

foreach($array as $key => $element) {
    if ($key === array_key_first($array))
        echo 'FIRST ELEMENT!';

    if ($key === array_key_last($array))
        echo 'LAST ELEMENT!';
}

সমস্ত পিএইচপি সংস্করণের সমাধান:

foreach($array as $key => $element) {
    reset($array);
    if ($key === key($array))
        echo 'FIRST ELEMENT!';

    end($array);
    if ($key === key($array))
        echo 'LAST ELEMENT!';
}

44
চমত্কার উত্তর! গুচ্ছ অ্যারে ব্যবহারের চেয়ে অনেক বেশি ক্লিনার।
পল জে

14
এটি শীর্ষে থেকে বুদবুদ হওয়া উচিত কারণ এটি সঠিক উত্তর। অ্যারে_শিফ্ট এবং অ্যারে_পপ ব্যবহার করে এই ফাংশনগুলির আরেকটি সুবিধা হ'ল অ্যারে অক্ষত রেখে দেওয়া হয়, যদি পরবর্তী পর্যায়ে তাদের প্রয়োজন হয়। জ্ঞানের ভাগ করে নেওয়ার জন্য এটির জন্য +1।
Awemo

13
আপনি যদি নিজের কোডটি পরিষ্কার রাখতে চান তবে এটি অবশ্যই সেরা উপায়। আমি এটি upvote করতে চলেছি, কিন্তু এখন আমি বিশ্বাস করি না এই অ্যারে পদ্ধতিগুলির কার্যকরী ওভারহেডের পক্ষে এটি মূল্যবান। আমরা শুধু তারপর শেষ উপাদান বিষয়ে কথা বলছি তাহলে যে end()+ + key()লুপ প্রতি পুনরাবৃত্তির উপর - যদি এটি উভয় তারপর এর যে 4 পদ্ধতি প্রত্যেক সময় বলা হচ্ছে। মঞ্জুরিপ্রাপ্ত, এগুলি খুব স্বল্প ওজনের অপারেশন হবে এবং সম্ভবত কেবল পয়েন্টার লুকআপ রয়েছে, তবে তারপরে ডক্সগুলি নির্দিষ্ট করে reset()এবং অ্যারের অভ্যন্তরীণ পয়েন্টারটি end() সংশোধন করতে যায় - তবে এটি কি কাউন্টারের চেয়ে দ্রুত হয়? সম্ভবত না।
pospi

19
আমার মনে হয় না যে আপনার পূর্বাভাসের মধ্যে পুনরায় সেট (ray অ্যারে) করা উচিত। অফিসিয়াল ডকুমেন্টেশন (www.php.net/foreach) থেকে: "ভবিষ্যদ্বাণীটি অভ্যন্তরীণ অ্যারে পয়েন্টারের উপর নির্ভর করে এটি লুপের মধ্যে পরিবর্তন করলে অপ্রত্যাশিত আচরণ হতে পারে" " এবং পুনরায় সেট করুন ঠিক তা (www.php.net/reset): "একটি অ্যারের অভ্যন্তরীণ পয়েন্টারটিকে তার প্রথম উপাদানটিতে সেট করুন"
গোনালো কুইরিস

11
@ গোনালো কুইয়ারস: এটি কাজ করে। Foreach অ্যারে একটি অনুলিপি উপর কাজ করে। তবে আপনি যদি এখনও উদ্বিগ্ন থাকেন reset()তবে ভবিষ্যদ্বাণী করার আগে কলটি সরাতে নির্দ্বিধায় এবং ফলাফলটি ক্যাশে করে নিন $first
রোক ক্রালজ

121

শেষ আইটেমটি সন্ধান করতে, আমি খুঁজে পেয়েছি কোডের এই টুকরোটি প্রতিবার কাজ করে:

foreach( $items as $item ) {
    if( !next( $items ) ) {
        echo 'Last Item';
    }
}

2
এটিতে খুব অল্প কিছু উপাখ্যান রয়েছে, এটি ব্যবহারে কোনও অসুবিধা আছে কি?
কেভিন কুয়েল


2
@ কেভিন কুয়েল - উপরে প্যাং দ্বারা উল্লিখিত, অ্যারেতে যদি এমন কোনও আইটেম থাকে যা পিএইচপি মিথ্যা হিসাবে মূল্যায়ন করে (যেমন 0, "" নাল) এই পদ্ধতির অপ্রত্যাশিত ফলাফল হবে। আমি কোডটি ব্যবহার করার জন্য সংশোধন করেছি ===
এরিক কিগাথি

4
এটি বেশিরভাগ ক্ষেত্রে খুব দুর্দান্ত তবে সমস্যাটি পরিষ্কার করার জন্য অন্যরা ইঙ্গিত করছে যে এটি যেমন অ্যারের সাথে অবিচ্ছিন্নভাবে ব্যর্থ হবে [true,true,false,true]। তবে ব্যক্তিগতভাবে আমি যে কোনও সময় এটি ব্যবহার করব যখন আমি বুরিয়ান ধারণ করে না এমন একটি অ্যারের সাথে ডিল করি false
বিলেণোহ

4
next()একটি foreach লুপ ভিতরে কখনও ব্যবহার করা উচিত । এটি অভ্যন্তরীণ অ্যারে পয়েন্টারটিকে গণ্ডগোল করে। আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন।
ড্রাজা

88

উপরের আরও সরলিকৃত সংস্করণ এবং ধরে নেওয়া যায় যে আপনি কাস্টম সূচকগুলি ব্যবহার করছেন না ...

$len = count($array);
foreach ($array as $index => $item) {
    if ($index == 0) {
        // first
    } else if ($index == $len - 1) {
        // last
    }
}

সংস্করণ 2 - কারণ আমি প্রয়োজন না হলে অন্যটি ব্যবহার করে ঘৃণা করতে এসেছি।

$len = count($array);
foreach ($array as $index => $item) {
    if ($index == 0) {
        // first
        // do something
        continue;
    }

    if ($index == $len - 1) {
        // last
        // do something
        continue;
    }
}

8
এটি বস্তুর জন্যও কাজ করে। অন্যান্য সমাধানগুলি কেবল অ্যারেগুলির জন্যই কাজ করে।
ল্যামি

1
এটি আমার পক্ষে সেরা উত্তর তবে ঘনীভূত হওয়া উচিত, ফোরচ লুপের বাইরে দৈর্ঘ্য ঘোষণার কোনও বিন্দু নেই: যদি ($ সূচক == গণনা ($ অ্যারে) -1) {...}
অ্যান্ড্রু

2
@ এন্ড্রু এইভাবে আপনি প্রতিটি পুনরাবৃত্তির জন্য অ্যারের উপাদানগুলি গণনা করে চলেছেন।
প্যাকারভালহো

1
@ পেটারোয়াক হ্যাঁ এটি কার্যত প্রযুক্তিগতভাবে ক্ষতি করে এবং আপনার গণনা কী পরিমাণ বা কতটি লুপ তাৎপর্যপূর্ণ হতে পারে তার উপর নির্ভর করে। সুতরাং আমার মন্তব্য উপেক্ষা করুন: ডি
অ্যান্ড্রু

4
@ পেটারোয়াক @ অ্যান্ড্রু একটি অ্যারেতে থাকা উপাদানগুলির মোট সংখ্যা অভ্যন্তরীণভাবে সম্পত্তি হিসাবে সঞ্চিত থাকে, তাই করে কোনও কার্যকারিতা হিট হবে না if ($index == count($array) - 1)এখানে দেখুন ।
গ্রীক্যাট্রিনা

36

আপনি অ্যারে থেকে প্রথম এবং শেষ উপাদানগুলি সরিয়ে আলাদাভাবে প্রক্রিয়া করতে পারেন।

এটার মত:

<?php
$array = something();
$first = array_shift($array);
$last = array_pop($array);

// do something with $first
foreach ($array as $item) {
 // do something with $item
}
// do something with $last
?>

ইনলাইন ট্যাগগুলির পরিবর্তে সমস্ত ফর্ম্যাটিং সিএসএসে সরিয়ে ফেলা আপনার কোডকে উন্নত করবে এবং লোডের সময় বাড়িয়ে তুলবে।

আপনি যখনই সম্ভব পিএইচপি যুক্তির সাথে এইচটিএমএল মিশ্রণ এড়াতে পারেন।

আপনার পৃষ্ঠাটিকে এই জাতীয় জিনিসগুলি পৃথক করে আরও অনেক বেশি পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করা যেতে পারে:

<?php
function create_menu($params) {
  //retrieve menu items 
  //get collection 
  $collection = get('xxcollection') ;
  foreach($collection as $c) show_collection($c);
}

function show_subcat($val) {
  ?>
    <div class="sub_node" style="display:none">
      <img src="../images/dtree/join.gif" align="absmiddle" style="padding-left:2px;" />
      <a id="'.$val['xsubcatid'].'" href="javascript:void(0)" onclick="getProduct(this , event)" class="sub_node_links"  >
        <?php echo $val['xsubcatname']; ?>
      </a>
    </div>
  <?php
}

function show_cat($item) {
  ?>
    <div class="node" >
      <img src="../images/dtree/plus.gif" align="absmiddle" class="node_item" id="plus" />
      <img src="../images/dtree/folder.gif" align="absmiddle" id="folder">
      <?php echo $item['xcatname']; ?>
      <?php 
        $subcat = get_where('xxsubcategory' , array('xcatid'=>$item['xcatid'])) ;
        foreach($subcat as $val) show_subcat($val);
      ?>
    </div>
  <?php
}

function show_collection($c) {
  ?>
    <div class="parent" style="direction:rtl">
      <img src="../images/dtree/minus.gif" align="absmiddle" class="parent_item" id="minus" />
      <img src="../images/dtree/base.gif" align="absmiddle" id="base">
      <?php echo $c['xcollectionname']; ?>
      <?php
        //get categories 
        $cat = get_where('xxcategory' , array('xcollectionid'=>$c['xcollectionid']));
        foreach($cat as $item) show_cat($item);
      ?>
    </div>
  <?php
}
?>

20

প্রথমটি সন্ধানের চেষ্টাটি হ'ল:

$first = true; 
foreach ( $obj as $value )
{
  if ( $first )
  {
    // do something
    $first = false; //in order not to get into the if statement for the next loops
  }
  else
  {
    // do something else for all loops except the first
  }
}

3
আপনার কোডটি কীভাবে কাজ করে এবং কীভাবে এটি ওপির সমস্যার সমাধান করে তার ব্যাখ্যা যোগ করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন। অনেক এসও পোস্টারগুলি নবাগত এবং আপনার পোস্ট করা কোডটি বুঝতে পারে না।
আমি

4
আপনি লুপের শেষ পুনরাবৃত্তিতে আছেন কিনা তা নির্ধারণ করার জন্য এই উত্তরটি বলে না। এটি যাইহোক, একটি উত্তরের একটি বৈধ প্রচেষ্টা, এবং উত্তর হিসাবে হিসাবে পতাকাঙ্কিত করা উচিত নয়। আপনি যদি এটি পছন্দ না করেন তবে আপনার এটি ভোট দেওয়া উচিত, এটি পতাকাঙ্কিত না করে।
আর্টঅফ ওয়ারফেয়ার

এটি স্পষ্ট, প্রথম পুনরাবৃত্তিতে তিনি প্রথম শর্তে প্রবেশ করবেন এবং তারপরে এটির মানটিকে মিথ্যা হিসাবে পরিবর্তন করবেন এবং এইভাবে এটি কেবল একবার প্রথম পুনরাবৃত্তিতে প্রবেশ করবে।
মোহামেদ

20

কেবল এই কাজ করে!

// Set the array pointer to the last key
end($array);
// Store the last key
$lastkey = key($array);  
foreach($array as $key => $element) {
    ....do array stuff
    if ($lastkey === key($array))
        echo 'THE LAST ELEMENT! '.$array[$lastkey];
}

শেষ ইস্যুটি বাছাই করার জন্য আপনাকে @ বিলিলোনাহকে ধন্যবাদ ।


3
শ্রেষ্ঠ! আমি কেবল স্পষ্ট করতে হবে if ($key === $lastkey)
ক্রিজিসটোফ প্রিজিগোদা

2
এই হওয়া উচিত নয় if ($lastkey === $key)?
गतिগত

1
আমি পেয়েছি:PHP Warning: key() expects parameter 1 to be array, integer given in php shell code on line 1
বিলিএনাহ

1
@ সিডওয়েল - ত্রুটিটি পড়ুন। key()পূর্ণসংখ্যা পাচ্ছে, পাচ্ছে না end()end()" শেষ উপাদানটির মান প্রদান করে " এবং key()ইনপুট হিসাবে একটি অ্যারের প্রত্যাশা করে।
বিলেন্নাহ


11

1: কেন একটি সাধারণ ব্যবহার করবেন না for বিবৃতি ? ধরে নিই যে আপনি একটি আসল অ্যারে ব্যবহার করছেন এবং একটি নয় Iteratorআপনি সহজেই পাল্টা ভেরিয়েবল 0 বা উপাদানগুলির সম্পূর্ণ সংখ্যার চেয়ে এক কম কিনা তা পরীক্ষা করে দেখতে পারেন। আমার মতে এটি সবচেয়ে পরিষ্কার এবং বোধগম্য সমাধান ...

$array = array( ... );

$count = count( $array );

for ( $i = 0; $i < $count; $i++ )
{

    $current = $array[ $i ];

    if ( $i == 0 )
    {

        // process first element

    }

    if ( $i == $count - 1 )
    {

        // process last element

    }

}

2: আপনার গাছের কাঠামো সংরক্ষণ করার জন্য আপনার নেস্টেড সেটগুলি ব্যবহার করা উচিত । অতিরিক্ত হিসাবে আপনি পুনরাবৃত্তি ফাংশন ব্যবহার করে পুরো জিনিস উন্নতি করতে পারেন।


আপনি যদি কোনও ব্যবহার করতে চলেছেন তবে আপনি forএটিকে লুপ থেকে বের 1করতে n-1এবং ifশরীরের বাইরে বের করতে পারেন । বারবার তাদের পরীক্ষা করার কোন মানে নেই।
এমপেন

9

সেরা উত্তর:

$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

foreach ($arr as $a) {

// This is the line that does the checking
if (!each($arr)) echo "End!\n";

echo $a."\n";

}

2
অ্যারেতে কেবল একটি উপাদান থাকলে এটি ব্যর্থ হয়।
মেমোচিপান

4
এটি যত তাড়াতাড়ি সহজ এবং যতক্ষণ না আপনি নিশ্চিত হতে পারেন যে অ্যারেতে সর্বদা একাধিক ক্ষত রয়েছে (যেমন মেমোচিপান বলেছেন) said সুতরাং এটি আমার পক্ষে কোনও ব্যর্থতা সমাধান নয় - কোনও 'সেরা উত্তর' নয়।
Seika85

5
প্রতিটি () পিএইচপি 7.2.0 হিসাবে অবহিত করা হবে । আরো দেখুন দয়া করে php.net/manual/en/function.each.php
ফ্লো

8

@ এমরগের সবচেয়ে কার্যকর উত্তর , বিপরীতভাবে, foreachকেবল হ্যাশ ম্যাপের অবজেক্টের জন্য নয় , সঠিক অ্যারেগুলির জন্য কাজ করে। এই উত্তরটি লুপের প্রতিটি পুনরাবৃত্তির জন্য শর্তাধীন বিবৃতিটির ওভারহেডকে এড়িয়ে চলে, যেমন বেশিরভাগ উত্তরগুলিতে (স্বীকৃত উত্তর সহ) নির্দিষ্টভাবে প্রথম এবং শেষ উপাদানটি পরিচালনা করে এবং মধ্যবর্তী উপাদানগুলিকে লুপ করে।

array_keysদক্ষ উত্তরটি কাজ করতে এই ফাংশনটি ব্যবহার করা যেতে পারে foreach:

$keys = array_keys($arr);
$numItems = count($keys);
$i=0;

$firstItem=$arr[$keys[0]];

# Special handling of the first item goes here

$i++;
while($i<$numItems-1){
    $item=$arr[$keys[$i]];
    # Handling of regular items
    $i++;
}

$lastItem=$arr[$keys[$i]];

# Special handling of the last item goes here

$i++;

আমি এটি নিয়ে বেঞ্চমার্কিং করিনি, তবে লুপটিতে কোনও যুক্তি যুক্ত করা হয়নি, যা পারফরম্যান্সের ক্ষেত্রে সবচেয়ে বড় আঘাত হ'ল, তাই আমি সন্দেহ করব যে দক্ষ উত্তর দিয়ে দেওয়া মানদণ্ডগুলি বেশ কাছাকাছি রয়েছে।

আপনি চেয়েছিলেন functionalize জিনিস এই ধরনের, আমি যেমন একটি সময়ে একটি সুইং গ্রহণ করেছি এখানে iterateList ফাংশন । যদিও, আপনি দক্ষতার বিষয়ে অত্যন্ত উদ্বিগ্ন থাকলে আপনি এই গিস্ট কোডটি বেঞ্চমার্ক করতে চাইতে পারেন। আমি নিশ্চিত না যে সমস্ত ক্রিয়াকলাপের অনুরোধটি কতটা ওভারহেডের সাথে পরিচয় করিয়ে দেয়।


6

এসকিউএল কোয়েরি জেনারেট করে স্ক্রিপ্টগুলি, বা যে কোনও কিছু যা প্রথম বা শেষ উপাদানগুলির জন্য পৃথক ক্রিয়া করে, অনিয়মিত ভেরিয়েবল চেক ব্যবহার এড়াতে এটি আরও দ্রুত (প্রায় দ্বিগুণ দ্রুত) দ্রুত হয় is

বর্তমান গৃহীত সমাধানটি লুপের মধ্যে একটি লুপ এবং একটি চেক ব্যবহার করে যা প্রতিটি_সিংল_িটেশন তৈরি করা হবে, এটি করার সঠিক (দ্রুত) উপায়টি হল:

$numItems = count($arr);
$i=0;
$firstitem=$arr[0];
$i++;
while($i<$numItems-1){
    $some_item=$arr[$i];
    $i++;
}
$last_item=$arr[$i];
$i++;

একটি সামান্য বাড়ির তৈরি মানদণ্ড নিম্নলিখিতগুলি দেখিয়েছিল:

পরীক্ষা 1: মডেল মর্গের 100000 রান

সময়: 1869.3430423737 মিলিসেকেন্ড

টেস্ট 2: মডেলের 100000 রান শেষ হলে

সময়: 3235.6359958649 মিলিসেকেন্ড

এবং এটি একেবারে পরিষ্কার যে চেকটির জন্য অনেক ব্যয় হয় এবং আপনি আরও বেশি পরিবর্তনশীল চেক যুক্ত করলে তা আরও খারাপ হয়ে যায়;)


আপনার কোডটি কেবলমাত্র তখনই কাজ করে যদি আপনার বাড়তি সংখ্যার চাবিগুলি নিশ্চিত থাকতে পারে। $arr = array('one' => "1 1 1", 4 => 'Four', 1 => 'One'); $numItems = count($arr); $i=0; $firstitem=$arr[0]; echo $i . ': ' . $firstitem . ", "; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; echo $i . ': ' . $some_item . ", "; $i++; } $last_item=$arr[$i]; echo $i . ': ' . $last_item . ", "; $i++;আউটপুট হবে:0: , 1: One, 2: ,
Seika85

একটি অ্যারেতে একটি হ্যাশ মানচিত্র castালাই অনির্ধারিত আচরণ, array()তৈরি "অবজেক্ট" {'one':"1 1 1",0:"",1:"One",2:"",3:"",4:"Four"}তবে খালি উপাদানগুলি গণনা সহ উপেক্ষা করা হয়, আপনি সংজ্ঞায়িত "জিনিস" এর সংখ্যা গণনা করছেন !! বন্টন ত্যাগের ইনকামিং! এই উত্তরটি অনুগ্রহের দাবিদার, তবে যদি @ মর্গ হয়। চলে গেছে, এটি অর্থহীন। আমি এমন ব্যক্তিকে অনুদান দেব যা সম্ভবত আবার এসও ব্যবহার করবে না! যদি সে ফিরে আসে এবং তার উত্তরটির উন্নতি করে তবে সে অনুগ্রহের দাবিদার!
mjz19910

@ Mjz19910 নোট হিসাবে, হ্যাশ মানচিত্র এবং অ্যারেগুলি বিনিময়যোগ্য নয়। তবে, আপনি array_keysফাংশনটির সাথে হ্যাশের বৈশিষ্ট্যগুলি পেতে পারেন , যা আপনি অ্যারের মতো আচরণ করতে পারেন । দেখুন আমার "উন্নত" উত্তর
TheMadDeveloper

এটিই আমি কোয়েরির জন্য ব্যবহার করছি:$querySet = ""; foreach ($fieldSet as $key=>$value) { $value = $db->dbLink->quote($value); $querySet .= "$key = $value, "; } $querySet = substr_replace($querySet, "", -2); $queryString = "UPDATE users SET $querySet WHERE user_ID = '$user_ID'";
রোভশান মমাদেভ

5

কী এবং মানগুলির সাথে এটি কাজ করে:

foreach ($array as $key => $value) {
    if ($value === end($array)) {
        echo "LAST ELEMENT!";
    }
}

2
এইভাবে আপনি মানগুলির তুলনা করছেন এবং কোনও অ্যারেতে দুটি একই উপাদান রয়েছে তা যদি কাজ করে না।
ক্রিজিসটফ প্রিজিগদা

5

বুলিয়ান ভেরিয়েবলটি ব্যবহার করা এখনও সবচেয়ে নির্ভরযোগ্য, আপনি যদি কোনও এর প্রথম উপস্থিতিটি পরীক্ষা করতে চান তবে $value (এটি আমার পরিস্থিতিতে এবং অনেক পরিস্থিতিতে আমি এটি আরও কার্যকর বলে মনে করেছি) যেমন:

$is_first = true;

foreach( $array as $value ) {
    switch ( $value ) {
        case 'match':
            echo 'appeared';

            if ( $is_first ) {
                echo 'first appearance';
                $is_first = false;
            }

            break;
        }
    }

    if( !next( $array ) ) {
        echo 'last value';
    }
}

তারপরে কীভাবে !next( $array )সর্বশেষটি সন্ধান করতে $valueহবে যা পুনরাবৃত্তি করার trueকোনও next()মূল্য নেই যদি ফিরে আসবে ।

এবং আমি যদি একটি কাউন্টার ব্যবহার করতে যাচ্ছি forতার পরিবর্তে foreachআমি একটি লুপ ব্যবহার করতে পছন্দ করি :

$len = count( $array );
for ( $i = 0; $i < $len; $i++ ) {
    $value = $array[$i];
    if ($i === 0) {
        // first
    } elseif ( $i === $len - 1 ) {
        // last
    }
    // …
    $i++;
}

4

আমি একই থ্রেড জুড়ে এসেছি যখন আমার একই সমস্যা রয়েছে। আমার কেবল প্রথম উপাদানটি পাওয়া দরকার তখনই আমি আমার কোডটি পুনরায় বিশ্লেষণ করব যতক্ষণ না এটি আমার মনে আসে।

$firstElement = true;

foreach ($reportData->result() as $row) 
{
       if($firstElement) { echo "first element"; $firstElement=false; }
       // Other lines of codes here
}

উপরের কোডগুলি দুর্দান্ত এবং সম্পূর্ণ তবে আপনার যদি কেবলমাত্র প্রথম উপাদানটির প্রয়োজন হয় তবে আপনি এই কোডটি ব্যবহার করে দেখতে পারেন।


2

এটি এখনও প্রয়োজনীয় কিনা তা নিশ্চিত নয়। তবে নিম্নলিখিত সমাধানটি পুনরাবৃত্তকারীদের সাথে কাজ করা উচিত এবং এর প্রয়োজন হয় না count

<?php

foreach_first_last(array(), function ($key, $value, $step, $first, $last) {
    echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});

foreach_first_last(array('aa'), function ($key, $value, $step, $first, $last) {
    echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;

foreach_first_last(array('aa', 'bb', 'cc'), function ($key, $value, $step, $first, $last) {
    echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;

function foreach_first_last($array, $cb)
{
    $next = false;
    $current = false;
    reset($array);
    for ($step = 0; true; ++$step) {
        $current = $next;
        $next = each($array);
        $last = ($next === false || $next === null);
        if ($step > 0) {
            $first = $step == 1;
            list ($key, $value) = $current;
            if (call_user_func($cb, $key, $value, $step, $first, $last) === false) {
                break;
            }
        }
        if ($last) {
            break;
        }
    }
}

0

আপনি একটি বেনামী ফাংশনটিও ব্যবহার করতে পারেন:

$indexOfLastElement = count($array) - 1;
array_walk($array, function($element, $index) use ($indexOfLastElement) {
    // do something
    if (0 === $index) {
        // first element‘s treatment
    }
    if ($indexOfLastElement === $index) {
        // last not least
    }
});

আরও তিনটি বিষয় উল্লেখ করা উচিত:

  • যদি আপনার অ্যারে কঠোরভাবে সূচিত না হয় (সংখ্যাগতভাবে) আপনাকে অবশ্যই array_valuesপ্রথমে আপনার অ্যারেটি পাইপ করতে হবে ।
  • আপনার যদি সংশোধন করতে হয় তবে $elementআপনাকে এটি রেফারেন্স ( &$element) দ্বারা পাস করতে হবে ।
  • আপনার ভিতরে অনামী অনিয়মিত ফাংশনের বাইরে কোনও ভেরিয়েবল, আপনার প্রয়োজনে পুনরায় রেফারেন্স সহ $indexOfLastElementতাদের useনির্মাণের অভ্যন্তরের পাশে তালিকাভুক্ত করতে হবে।

0

আপনি কাউন্টার এবং অ্যারের দৈর্ঘ্য ব্যবহার করতে পারেন।

    $ অ্যারে = অ্যারে (1,2,3,4);

    $ i = 0;
    $ লেন = গণনা ($ অ্যারে);
    foreach ($ আইটেম হিসাবে অ্যারে) {
        যদি ($ i === 0) {
            // প্রথম
        } অন্যথায় যদি ($ i === $ লেন - 1) {
            // সর্বশেষ
        }
        //…
        আমি $ ++,;
    }

0
foreach ($arquivos as $key => $item) {
   reset($arquivos);
   // FIRST AHEAD
   if ($key === key($arquivos) || $key !== end(array_keys($arquivos)))
       $pdf->cat(null, null, $key);

   // LAST
   if ($key === end(array_keys($arquivos))) {
       $pdf->cat(null, null, $key)
           ->execute();
   }
}

0

ব্যবহার রিসেট ($ অ্যারে) এবং শেষ ($ অ্যারে)

<?php

    $arrays = [1,2,3,4,5];

    $first  = reset($arrays);
    $last   = end($arrays);    

    foreach( $arrays as $array )
    {

        if ( $first == $array )
        {
            echo "<li>{$array} first</li>";
        }
        else if ( $last == $array )
        {
            echo "<li>{$array} last</li>";
        }
        else
        {
            echo "<li>{$array}</li>";
        }                

    }

ডেমো repl.it


-2

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

function children( &$parents, $parent, $selected ){
  if ($parents[$parent]){
    $list = '<ul>';
    $counter = count($parents[$parent]);
    $class = array('first');
    foreach ($parents[$parent] as $child){
      if ($child['id'] == $selected)  $class[] = 'active';
      if (!--$counter) $class[] = 'last';
      $list .= '<li class="' . implode(' ', $class) . '"><div><a href="]?id=' . $child['id'] . '" alt="' . $child['name'] . '">' . $child['name'] . '</a></div></li>';
      $class = array();
      $list .= children($parents, $child['id'], $selected);
    }
    $list .= '</ul>';
    return $list;
  }
}
$output .= children( $parents, 0, $p_industry_id);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.