উত্তর:
আপনি একটি কাউন্টার ব্যবহার করতে পারেন:
$i = 0;
$len = count($array);
foreach ($array as $item) {
if ($i == 0) {
// first
} else if ($i == $len - 1) {
// last
}
// …
$i++;
}
$i = 1
চিন্তা করার দরকার নেই $len - 1
, কেবল ব্যবহার করুন $len
।
যদি আপনি এমন কোনও সমাধান পছন্দ করেন যা লুপের বাইরে কাউন্টারটির সূচনা প্রয়োজন না, তবে আমি বর্তমান পুনরাবৃত্তি কীটি ফাংশনের সাথে তুলনা করার প্রস্তাব দিচ্ছি যা আপনাকে অ্যারের শেষ / প্রথম কীটি বলে tells
এটি আসন্ন পিএইচপি 7.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!';
}
end()
+ + key()
লুপ প্রতি পুনরাবৃত্তির উপর - যদি এটি উভয় তারপর এর যে 4 পদ্ধতি প্রত্যেক সময় বলা হচ্ছে। মঞ্জুরিপ্রাপ্ত, এগুলি খুব স্বল্প ওজনের অপারেশন হবে এবং সম্ভবত কেবল পয়েন্টার লুকআপ রয়েছে, তবে তারপরে ডক্সগুলি নির্দিষ্ট করে reset()
এবং অ্যারের অভ্যন্তরীণ পয়েন্টারটি end()
সংশোধন করতে যায় - তবে এটি কি কাউন্টারের চেয়ে দ্রুত হয়? সম্ভবত না।
reset()
তবে ভবিষ্যদ্বাণী করার আগে কলটি সরাতে নির্দ্বিধায় এবং ফলাফলটি ক্যাশে করে নিন $first
।
শেষ আইটেমটি সন্ধান করতে, আমি খুঁজে পেয়েছি কোডের এই টুকরোটি প্রতিবার কাজ করে:
foreach( $items as $item ) {
if( !next( $items ) ) {
echo 'Last Item';
}
}
[true,true,false,true]
। তবে ব্যক্তিগতভাবে আমি যে কোনও সময় এটি ব্যবহার করব যখন আমি বুরিয়ান ধারণ করে না এমন একটি অ্যারের সাথে ডিল করি false
।
next()
একটি foreach লুপ ভিতরে কখনও ব্যবহার করা উচিত । এটি অভ্যন্তরীণ অ্যারে পয়েন্টারটিকে গণ্ডগোল করে। আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন।
উপরের আরও সরলিকৃত সংস্করণ এবং ধরে নেওয়া যায় যে আপনি কাস্টম সূচকগুলি ব্যবহার করছেন না ...
$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;
}
}
if ($index == count($array) - 1)
। এখানে দেখুন ।
আপনি অ্যারে থেকে প্রথম এবং শেষ উপাদানগুলি সরিয়ে আলাদাভাবে প্রক্রিয়া করতে পারেন।
এটার মত:
<?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
}
?>
প্রথমটি সন্ধানের চেষ্টাটি হ'ল:
$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
}
}
কেবল এই কাজ করে!
// 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];
}
শেষ ইস্যুটি বাছাই করার জন্য আপনাকে @ বিলিলোনাহকে ধন্যবাদ ।
if ($key === $lastkey)
।
if ($lastkey === $key)
?
PHP Warning: key() expects parameter 1 to be array, integer given in php shell code on line 1
key()
পূর্ণসংখ্যা পাচ্ছে, পাচ্ছে না end()
। end()
" শেষ উপাদানটির মান প্রদান করে " এবং key()
ইনপুট হিসাবে একটি অ্যারের প্রত্যাশা করে।
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
শরীরের বাইরে বের করতে পারেন । বারবার তাদের পরীক্ষা করার কোন মানে নেই।
সেরা উত্তর:
$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";
}
@ এমরগের সবচেয়ে কার্যকর উত্তর , বিপরীতভাবে, 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 ফাংশন । যদিও, আপনি দক্ষতার বিষয়ে অত্যন্ত উদ্বিগ্ন থাকলে আপনি এই গিস্ট কোডটি বেঞ্চমার্ক করতে চাইতে পারেন। আমি নিশ্চিত না যে সমস্ত ক্রিয়াকলাপের অনুরোধটি কতটা ওভারহেডের সাথে পরিচয় করিয়ে দেয়।
এসকিউএল কোয়েরি জেনারেট করে স্ক্রিপ্টগুলি, বা যে কোনও কিছু যা প্রথম বা শেষ উপাদানগুলির জন্য পৃথক ক্রিয়া করে, অনিয়মিত ভেরিয়েবল চেক ব্যবহার এড়াতে এটি আরও দ্রুত (প্রায় দ্বিগুণ দ্রুত) দ্রুত হয় 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: ,
array()
তৈরি "অবজেক্ট" {'one':"1 1 1",0:"",1:"One",2:"",3:"",4:"Four"}
তবে খালি উপাদানগুলি গণনা সহ উপেক্ষা করা হয়, আপনি সংজ্ঞায়িত "জিনিস" এর সংখ্যা গণনা করছেন !! বন্টন ত্যাগের ইনকামিং! এই উত্তরটি অনুগ্রহের দাবিদার, তবে যদি @ মর্গ হয়। চলে গেছে, এটি অর্থহীন। আমি এমন ব্যক্তিকে অনুদান দেব যা সম্ভবত আবার এসও ব্যবহার করবে না! যদি সে ফিরে আসে এবং তার উত্তরটির উন্নতি করে তবে সে অনুগ্রহের দাবিদার!
array_keys
ফাংশনটির সাথে হ্যাশের বৈশিষ্ট্যগুলি পেতে পারেন , যা আপনি অ্যারের মতো আচরণ করতে পারেন । দেখুন আমার "উন্নত" উত্তর ।
$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'";
কী এবং মানগুলির সাথে এটি কাজ করে:
foreach ($array as $key => $value) {
if ($value === end($array)) {
echo "LAST ELEMENT!";
}
}
বুলিয়ান ভেরিয়েবলটি ব্যবহার করা এখনও সবচেয়ে নির্ভরযোগ্য, আপনি যদি কোনও এর প্রথম উপস্থিতিটি পরীক্ষা করতে চান তবে $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++;
}
আমি একই থ্রেড জুড়ে এসেছি যখন আমার একই সমস্যা রয়েছে। আমার কেবল প্রথম উপাদানটি পাওয়া দরকার তখনই আমি আমার কোডটি পুনরায় বিশ্লেষণ করব যতক্ষণ না এটি আমার মনে আসে।
$firstElement = true;
foreach ($reportData->result() as $row)
{
if($firstElement) { echo "first element"; $firstElement=false; }
// Other lines of codes here
}
উপরের কোডগুলি দুর্দান্ত এবং সম্পূর্ণ তবে আপনার যদি কেবলমাত্র প্রথম উপাদানটির প্রয়োজন হয় তবে আপনি এই কোডটি ব্যবহার করে দেখতে পারেন।
এটি এখনও প্রয়োজনীয় কিনা তা নিশ্চিত নয়। তবে নিম্নলিখিত সমাধানটি পুনরাবৃত্তকারীদের সাথে কাজ করা উচিত এবং এর প্রয়োজন হয় না 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;
}
}
}
আপনি একটি বেনামী ফাংশনটিও ব্যবহার করতে পারেন:
$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
নির্মাণের অভ্যন্তরের পাশে তালিকাভুক্ত করতে হবে।আপনি কাউন্টার এবং অ্যারের দৈর্ঘ্য ব্যবহার করতে পারেন।
$ অ্যারে = অ্যারে (1,2,3,4); $ i = 0; $ লেন = গণনা ($ অ্যারে); foreach ($ আইটেম হিসাবে অ্যারে) { যদি ($ i === 0) { // প্রথম } অন্যথায় যদি ($ i === $ লেন - 1) { // সর্বশেষ } //… আমি $ ++,; }
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();
}
}
ব্যবহার রিসেট ($ অ্যারে) এবং শেষ ($ অ্যারে)
<?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>";
}
}
এটা চেষ্টা কর:
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);
array_shift
এবং এর মতো আবর্জনা নয়array_pop
। যদিও এই সমাধানটি আমি এসেছি যদি আমাকে এমন কিছু বাস্তবায়ন করতে হত তবে আমি রোক ক্রালের উত্তরটি এখনই আটকে থাকি।