آگهی
article

حلقه for، foreach و while در PHP

php-for-while-loop

تا این مرحله از آموزش های مقدماتی PHP تا حدود زیادی مسیرمان را به سمت یادگیری این زبان پرکاربرد برنامه نویسی وب هموار کرده ایم، پس از آشنایی با مبحث متغیرها، عملگرهای محاسبه، مقایسه و استدلال منطقی، کار با دستورات شرطی if و else و بررسی نحوه استفاده از switch و case در کدنویسی ها، این بار نوبت به آموزش کاربرد حلقه های for، foreach و while در PHP است، از آنجایی که حلقه ها در زبان های برنامه نویسی و به طور خاص در برنامه نویسی PHP کاربردهای فراوانی دارند یادگیری و درک این مبحث می تواند در روند پیشرفت آموزش ها بسیار کمک کننده باشد، در ادامه خواهیم گفت که چرا و چگونه باید از حلقه for، foreach و while در کدنویسی استفاده کنیم.

حلقه (Loop) چیست؟


در اکثر زبان های برنامه نویسی و از جمله PHP حلقه ها برای انجام فرآیندها و بلاکی از کد در دور تکرار کاربرد دارند، در هنگام کدنویسی موقعیت های زیادی پیش می آید که بخواهیم قسمتی از کد برنامه را با تکرار اجرا کنیم، در این مواقع ابزار برنامه نویس معمولا استفاده از حلقه (Loop) است، به طور مثال اگر در یک مسابقه 5 گروه شرکت کننده داشته باشیم و بخواهیم امتیاز کسب شده آنها را در جدول ترسیم کنیم، می توانیم این کار را با حلقه انجام دهیم:
<?php
echo '<table border="1">';
$group = array('A' => 120, 'B' => 125, 'C' => 83, 'D' => 154, 'E' => 123);
foreach($group as $key => $value) {
    echo '<th>' . $key . '</th>' . '<td>' . $value . '</td><tr></tr>';
}
echo '</table>';
?>
با اجرای نمونه کد بالا نتیجه در جدول نمایش داده خواهد شد، به فرض:
A    120
B    125
C    83
D    154
E    123
در این نمونه کد از آرایه و حلقه foreach استفاده شده که در ادامه بیشتر توضیح خواهیم داد.

انواع حلقه در PHP


مانند اغلب زبان های برنامه نویسی در PHP نیز چند نوع حلقه (Loop) وجود دارد که با به حساب آوردن همه آنها می توان تعداد حلقه در PHP را در چهار دسته خلاصه کرد:
حلقه for، حلقه foreach، حلقه while و حلقه do while.
حلقه for برای مواقعی کاربرد دارد که تعداد دور حلقه عدد مشخصی باشد، حلقه foreach برای کار با آرایه ها (کلید و مقدار) مناسب است، حلقه while برای مواقعی که دور حلقه صرفا مبتنی بر برقرار (true) یا عدم برقرار (false) بودن یک شرط است و تعداد دور حلقه از قبل مشخص نباشد کاربرد دارد، در نهایت شکل دیگری از حلقه while تحت عنوان do while وجود دارد که تنها تفاوت آن با while ساده اجرای اولین دور بدون در نظر گرفتن true یا false بودن شرط حلقه است، در ادامه به صورت موردی در خصوص هر کدام از حلقه ها و نحوه کاربرد آنها توضیح خواهیم داد.

حلقه for در PHP


اولین حلقه ای که می خواهیم بررسی کنیم for است، از حلقه for در PHP زمانی استفاده می کنیم که بخواهیم به تعداد مشخصی دور تکرار داشته باشیم، به عبارتی دور تکرار در حلقه for از قبل مشخص است و معمولا در هر دور فرآیندی صورت می گیرد که در نهایت شرط حلقه false شده و دور تکرار به اتمام برسد، مثال:
<?php
//حلقه for
for($i = 1; $i <= 3; $i++){
    echo "دور شماره $i <br>";
}
?>
مثال بالا خروجی زیر را تولید خواهد کرد.
دور شماره 1 
دور شماره 2
دور شماره 3
توضیح:
- شیوه نگارش (Syntax) حلقه for به این صورت است که ساختار اصلی سه عبارت (Expression) دارد، عبارت اول همان مقادیر پیش فرض برای متغیر (i = 1) است، عبارت دوم تعیین شرط برای زمان خاتمه حلقه است (i <= 3) و عبارت آخر تغییرات مقادیر متغیر در هر دور حلقه است (افزایش i به میزان یک واحد با عملگر ++).
- عبارت i در مثال بالا فرضی و انتخابی است، طبق رویه برنامه نویسان معمولا از کاراکتر i بدین منظور استفاده می کنند، در صورت نیاز می توان از هر عنوان مجاز دیگری استفاده کرد.
- دقت کنیم در برنامه نویسی حلقه هایی که می نویسیم باید در مرحله ای به پایان برسند، اگر بررسی شرط حلقه همیشه درست (true) باشد دور تکرار آن تا بی نهایت (Infinite Loop) ادامه می یابد و قاعدتا این حالت یک باگ و نقص بزرگ در برنامه است و نهایتا باعث از کار افتادن مرورگر کاربر یا Down شدن سرور خواهد شد.
در مثال زیر اشتباه کوچکی صورت گرفته و حلقه تا بی نهایت ادامه پیدا می کند، با کمی دقت متوجه ایراد کار خواهیم شد:
<?php
//حلقه for تکرار بينهايت
for($i = 0; $i >= 0; $i++){
    echo "دور شماره $i <br>";
}
?>
با دقت در ساختار حلقه مشخص است که شرط آن همواره true و برقرار است (مقدار i عددی مساوی 0 یا بزرگتر از آن خواهد بود).

حلقه foreach در PHP


نوع دیگری از حلقه در PHP تحت عنوان foreach برای کار با آرایه ها کاربرد دارد، آرایه در زبان های برنامه نویسی و از جمله برنامه نویسی وب کاربردهای زیادی دارد و به همین دلیل مفسر PHP برای کنترل و پردازش این نوع متغیرها ابزار حلقه foreach را در نظر گرفته است، به طور مثال وقتی در فرم HTML فیلد Select با قابلیت انتخاب چند value را به سرور ارسال می کنیم معمولا از طریق حلقه است که می توانیم به تمام مقادیر ارسال شده دسترسی داشته باشیم، در این حالت حلقه foreach در هر دور از ابتدا به انتها کلید و مقدار آرایه را پردازش کرده و تا زمانی که اطلاعات وجود دارد و شرط حلقه درست یا true باشد، دور تکرار ادامه پیدا می کند، مثال:
برای انتخاب چند مورد کليد Ctrl را نگهداريد.<br>
<form action="" method="post">
<label for="select">انتخاب یک یا چند مورد:</label>
<select name="select[]" id="select" multiple="multiple" size="4">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<br>
<input name="check" type="hidden" value="1">
<input type="submit" value="ارسال">
</form>

<?php
$select = @$_POST['select'];
//print_r($select);
$check = @$_POST['check'];

if($check == 1) {
    foreach($select as $key => $value) {
        echo 'مقدار دور شماره ' . $key . ': ' . $value . '<br>';
    }
}
?>
در صورت انتخاب مقدار دوم و چهارم از فیلد Select خروجی مثال بالا به صورت زیر خواهد بود:
مقدار دور شماره 0: 2
مقدار دور شماره 1: 4
توضیح:
- زمانی که بخواهیم با فیلد Select چند مقدار به صورت همزمان ارسال شوند باید قسمت name آن را با علامت [] در انتها درج کنیم این کاراکتر یک قرارداد است و به مرورگر می گوید که قصد ارسال مقادیر به صورت آرایه را داریم، همچنین پارامتر mutiple نیز برای تگ select باید تنظیم شده باشد.
- پس از انتخاب و ارسال اطلاعات فرم در سمت سرور مقادیر با متد POST دریافت و به متغیر select نسبت داده می شود، اگر قسمت print_r را اجرا کنیم نتیجه مشابه نمونه زیر در خروجی چاپ می شود:
Array ( [0] => 2 [1] => 4 )
این نتیجه همان آرایه و مقدار ارسال شده است.
- دقت کنیم شمارش در آرایه از 0 شروع می شود و اولین مقدار 1 نیست، در اینجا نیز فیلد اول با کلید 0 و مقدار 2 و فیلد چهارم با کلید 1 و مقدار 4 مشخص است.
- حلقه foreach از دو شیوه نگارش (Syntax) پشتیبانی می کند، هم به صورت:
$array as $value
و هم به صورت:
$array as $key => $value
همان طور که مشخص است در هر دو حالت قسمت مقدار وجود دارد.
- هر کلید و مقدار آرایه در هر دور حلقه به ترتیب به عنوان ورودی انتخاب و پس از اعمال پردازش تعیین شده نوبت به کلید و مقدار بعدی می رسد تا زمانی که پارامترهای آرایه به انتها برسند، در مثال بالا آرایه ما دارای دو مقدار است پس دور حلقه foreach برای هر کدام یک بار اجرا خواهد شد (for به معنی برای و each به معنی هر).
- درک صحیح نحوه عملکرد حلقه foreach نیازمند آشنایی کامل با مبحث آرایه ها در PHP است، لذا در اینجا به همین مقدار بسنده می کنیم.

حلقه while در PHP


ساختار حلقه while در PHP و اغلب زبان های برنامه نویسی به این صورت است که با بررسی شرط تا هر زمان که برقرار و درست (true) باشد کدهای داخل کاراکترهای {} اجرا می شود، برخلاف حلقه for که باید تعداد دور حلقه از قبل و درون ساختار حلقه مشخص باشد در حلقه while الزامی به مشخص بودن تعداد دور حلقه نیست و خاتمه حلقه مبتنی بر false شدن بررسی برقراری شرط آن است که عمدتا مبتنی بر متغیری بیرون از حلقه است، در مثال ساده زیر حلقه while را تا زمانی که تعداد کاربران (متغیر فرضی user) بیشتر از عدد 0 است ادامه داده و خروجی از آن گرفته ایم:
<?php
//مقادير پيش فرض براي متغير
$users = 5;
//حلقه while
while($users > 0){
    echo "کاربر شماره $users <br>";
    $users--;
}
?>
خروجی کد بالا به صورت زیر خواهد بود:
کاربر شماره 5 
کاربر شماره 4
کاربر شماره 3
کاربر شماره 2
کاربر شماره 1
توضیح:
- ابتدا برای متغیر فرضی users یک مقدار پیش فرض قرار می دهیم تا بعد در حلقه while برای آن شرط تعیین کنیم.
- سپس در قسمت مربوط به حلقه while بررسی می کنیم تا زمانی که مقادیر متغیر users بزرگتر از صفر باشد بلاک کد داخل کاراکترهای {} اجرا شود.
- درون حلقه یک دستور خروجی echo نوشته ایم که در هر دور مقادیر را چاپ می کند و در قسمت آخر در هر دور حلقه یک واحد از متغیر users کاسته می شود و این کار تا زمانی که مقادیر این متغیر بزرگتر از 0 است ادامه می یابد.
- دقت کنیم چون متغیر فرضی ما در این مثال به صورت عددی بود می توانیم بر روی آن اعمال ریاضی مثل جمع، تفریق و... را انجام دهیم، در برنامه نویسی سطح بالاتر موقعیت هایی پیش می آید که انواع متفاوتی از داده ها (String، Integer، Boolean، Array و...) را باید با توجه به نوع آنها بررسی کنیم.

مثال دیگری از کاربرد حلقه while در PHP


برای آشنایی بیشتر مثال دیگری از کاربرد حلقه while در برنامه نویسی PHP را با هم بررسی می کنیم:
<?php
//مقادیر پیش فرض برای متغیر
$users = 5;
$admin = 1;
//حلقه while
while($users > 0){
    //حلقه تو در تو
    while($admin > 0){
        echo "مدیر سایت، خوش آمدید<br />";
        $admin--;
    }    
    echo "کاربر شماره $users خوش آمدید<br />";
    $users--;
}
?>
خروجی کد بالا به صورت زیر خواهد بود.
مدیر سایت، خوش آمدید
کاربر شماره 5 خوش آمدید
کاربر شماره 4 خوش آمدید
کاربر شماره 3 خوش آمدید
کاربر شماره 2 خوش آمدید
کاربر شماره 1 خوش آمدید
توضیح:
- مثال بالا نحوه استفاده از حلقه while درون حلقه ای دیگر را به صورت تو در تو نشان می دهد.
- ساختار حلقه با کمی تامل قابل درک است، تنها چیزی که اینجا اضافه کرده ایم متغیر admin و حلقه مربوط به آن است که در درون حلقه اصلی اجرا می شود.
- استفاده از این شیوه یعنی حلقه های تو در تو در برنامه نویسی سطح پیشرفته تر PHP با توجه به نیاز برنامه ها کاربردهای خاص خودش را دارد.

حلقه while بدون شرط در PHP


گفتیم در حالت عادی حلقه while باید همراه با یک شرط استفاده شود اما این قابلیت در مفسر PHP وجود دارد که حلقه while را بدون در نظر گرفتن شرط و صرفا با درج عبارت true استفاده کنیم، مثال:
<?php
$i = true;
$loop = 1;

while(true) {
    if($i === false) {
        break;
    } else {
        echo 'Loop: ' . $loop . '<br>';
    }

    if($loop > 4) {
        $i = false;
    } else {
        $loop++;
    }
}
?>
خروجی نمونه کد بالا به صورت زیر خواهد بود:
Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5
همان طور که مشخص است در صورتی که متغیر فرضی loop به مقدار 5 برسد متغیر i به صورت false مقداردهی می شود و در نتیجه در دور بعدی بررسی شرط if اول مثبت شده و دستور break اجرا می شود، در ادامه خواهیم دید که با اجرای دستور break دور حلقه while به پایان می رسد.

حلقه do while در PHP


در برنامه نویسی وب با PHP گاهی مواقع پیش می آید که بخواهیم حلقه while را بدون بررسی شرط آن حداقل یک بار اجرا کنیم و در دورهای بعدی بررسی کنیم که آیا شرایط ادامه حلقه مهیا است یا خیر، مفسر PHP بدین منظور از ساختار do while که شبیه while عادی است بهره می گیرد، تنها تفاوت این است که در do while دور اول حلقه بدون هیچ پیش شرطی اجراء می شود اما دورهای بعد مثل این است که به روال عادی حلقه while بازگشت کنیم، مثال زیر روشن است:
<?php
//مقادیر پیش فرض برای متغیر
$i = 1;
do{
    echo "کاربر شماره $i خوش آمدید<br>";
    $i--;
}
//حلقه while
while ($i > 1);
?>
در مثال بالا با وجود اینکه در قسمت شرط while گفته ایم تا زمانی که متغیر i از 1 بزرگتر باشد و مقادیر این متغیر به صورت پیش فرض 1 است (شرط برقرار نیست)، اما خروجی زیر به مرورگر ارسال می شود:
کاربر شماره 1 خوش آمدید
این حالت به جهت خاصیت ذاتی حلقه do while است که دور اول حلقه بدون بررسی شرط آن اجرا می شود.

استفاده از break و continue در حلقه ها


در ساختار حلقه ها در صورت نیاز می توانیم از دو دستور کلیدی break و continue استفاده کنیم، اجرای دستور break باعث اتمام کلی حلقه شده و دستور continue باعث ایجاد حالت پرش به دور بعدی خواهد شد، مثال:
<?php
$num = 10;

while(true) {
    if($num == 4) {
        $num--;
        continue;
    } elseif($num == 1) {
        break;
    }

    if($num % 2 == 0) {
        echo "$num: Even - زوج<br>";
    } else {
        echo "$num: Odd - فرد<br>";
    }

    $num--;
}
?>
با اجرای نمونه کد بالا خروجی زیر در مرورگر چاپ می شود:
10: Even - زوج
9: Odd - فرد
8: Even - زوج
7: Odd - فرد
6: Even - زوج
5: Odd - فرد
3: Odd - فرد
2: Even - زوج
نکته مهم این نمونه ساختار کاهش یک واحدی متغیر فرضی num در قسمتی است که می خواهیم دستور continue را اجرا کنیم، اگر این کاهش اتفاق نیفتد حلقه در دور تکرار بینهایت گرفتار می شود چون مقدار num همواره 4 است و در دورهای بعدی پیوسته دستور شرطی if حلقه اجرا می شود!

شیوه نگارش (Syntax) جایگزین در حلقه ها


در انتهای این مبحث بد نیست اشاره ای به دیگر شیوه های نگارش (Syntax) حلقه ها در PHP داشته باشیم، مفسر PHP علاوه بر در نظر گرفتن شیوه دستوری متداول برای نوشتن حلقه ها شکل دیگری از نگارش را تحت عنوان "دو نقطه یا Colon Syntax" پشتیبانی می کند که البته خیلی متداول نیست اما جهت آشنایی بیشتر چند نمونه زیر را بررسی می کنیم:
<?php
for($i = 1; $i <= 10; $i++):
    echo $i;
endfor;
?>
خروجی:
12345678910

<?php
$i = 1;
while($i <= 10):
    echo $i;
    $i++;
endwhile;
?>
خروجی:
12345678910
در این شیوه به جای استفاده از کاراکترهای {} جهت تعیین محدوده بلاک حلقه، از کاراکتر : و عبارت endfor یا endwhile استفاده شده است، این سبک حلقه در نتیجه هیچ تفاوتی با شیوه متداول ندارد و صرفا شکل ظاهری آن متفاوت است.
sectionدسته بندی: آموزش مقدماتی » PHP
related مطالب بیشتر:
» تعریف و استفاده از متغیر (Variable) در PHP
» توابع (Functions) در PHP
» دستور switch و case در PHP
» توابع کار با آرایه در PHP - بخش اول
» آرایه (Array) در برنامه نویسی PHP
commentنظرات (۵۰ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: علی
زمان: ۲۲:۰۴:۵۲ - تاریخ: ۱۳۹۳/۱۱/۱۵
ببخشید در مورد دستور بالا یه سوال دیگه داشتم اول تشکر می کنم برای پاسخ دادنتون دوم من برای نمایش قیمت از دستور زیر استفاده می کنم که اشتباهه .
<input type="text" name="price" value="<?php echo($row['price']); ?>" readonly="yes"/>
می خوام بجای این دستور ،دستوری بدم (طبق کد قبلی) وقتی هر کالایی انتخاب کردم قیمتش تو کادر (که زیر همین انتخاب محصول گذاشتم) نمایش داده بشه آیا راهی هست؟ ممنون
پاسخ: 
راه هست اما نه خیلی ساده! در واقع شما باید HTML + JavaScript + PHP را با هم ترکیب کنید:
باید برای تگ select خود یک رویداد جاوا اسکریپتی تعریف کنید که پس از onchange مقدار value گزینه (option) مورد نظر را در یک فیلد input قرار دهد (قاعدتا برای تعریف این رویه باید کدنویسی کنید).
نویسنده: پریسا
زمان: ۱۲:۰۵:۵۴ - تاریخ: ۱۳۹۳/۱۱/۱۹
با سلام و عرض ادب
خسته نباشید به شما مدیر محترم با این سایت واقعا عالی که دارید راهنماییهای شما همیشه کمک بزرگی به بنده کرده. یه سوال داشتم من یک صفحه ای بنام ثبت قرارداد دارم که میخوام شماره قراردادها رو از 2000 تولید کنم و همزمان وقتی کاربر داره قرارداد ثبت میکنه شماره قرارداد و ببینه یعنی همزمان شماره تولید و چاپ بشه. من برای تولید این کد رو نوشتم ولی توی 2001 گیر میکنه و برای چاپ نمیدونم چه کنم لطفا راهنمایی کنید.
حذف شد
پاسخ: 
سلام
ظاهرا کدهای شما مشکل syntax دارند، برای بررسی بیشتر فایل php خود را از طریق ایمیل (موجود در بخش تماس) به صورت فایل فشرده (zip) ارسال و پاسخ را از همان طریق پیگیر باشید.
نویسنده: سعید
زمان: ۰۶:۰۷:۲۶ - تاریخ: ۱۳۹۴/۰۴/۲۲
عرض سلام
ببخشید من موقع استفاده از کوئری داخل حلقه while به مشکل برخوردم مثلا هنگام استفاده از کد زیر که برای نمایش (نظرات) و (پاسخ هر نظر) هست استفاده میکنم
<?php
global $db;
$t = Array();
$db->sql_query("SELECT * FROM `comment` WHERE `id_post`= '5' AND `status`= '1' ");
while($comment = $db->sql_fetcharray()){
echo" ".$comment['text']." ";
$t[] = $comment;
}
foreach($t AS $comment){
$db->sql_query("SELECT * FROM `comment` WHERE `id_post`= '".$comment['ID']."' AND `status`= '1' ");
while($comment = $db->sql_fetcharray()){
echo" ".$comment['text']." ";
}
}
?>
اما مشکلی که (هست پاسخ هر نظر) رو که از حلقه foreach بدست میاد رو در انتهای تمام نظرات نشون میده که البته درست هم هست
اما اگه بخوام نتیجه کوئری اجرا شده ی foreach در while اول که خود نظر رو نمایش میده مستقیما جلوی همان کوئری نمایش داده شود باید از چه متدی استفاده شود ؟ (در واقع مانند سایت وبگو هر پاسخ جلوی همان نظر نمایش داده شود نه اینکه تمام پاسخ ها بعد از تمام نظرات نمایش داده شوند)
ممنون
پاسخ: 
سلام
از کدهای درج شده نمی توان ساختار دیتابیس و اینکه پاسخ ها در چه جدول و ستونی ذخیره می شوند را حدس زد! اما با فرض اینکه پاسخ ها نیز برای هر نظر، در ستون دیگری از همان ردیف ذخیره شوند، می توانید همان طور که text را استخراج می کنید، ستون مربوط به پاسخ را در همان دور حلقه استخراج کنید، به طور مثال:
while($comment = $db->sql_fetcharray()){
echo" ".$comment['text']." ";
echo" ".$comment['replay']." ";
}
این روش ساده ترین حالت است و به نظر در اینجا نیازی به استفاده از حلقه foreach نیست!
نویسنده: محمد
زمان: ۱۳:۳۰:۱۳ - تاریخ: ۱۳۹۴/۰۶/۲۳
سلام کاربرد این
$i++
چیه
پاسخ: 
سلام
علامت ++ به معنی یک واحد افزایش است و لذا تکه کد درج شده برای افزایش متغیر i به میزان یک واحد (در هر دور حلقه) است.
نویسنده: امیر
زمان: ۰۹:۵۴:۳۳ - تاریخ: ۱۳۹۴/۰۷/۰۸
سلام و خسته نباشید
اسلایدری در سایتم دارم که وقتی میخوام آپدیتش کنم و عکس جدیدی بذارم باید مستقیما کدهای فایل index.php رو ویرایش کنم
آیا راهی هست با php اینکارو در محیط وردپرس انجام بدم؟
ممنون میشم پاسخ بدید
پاسخ: 
سلام
راه ساده ای برای این کار وجود ندارد! باید با ساختار وردپرس و نحوه عملکرد پلاگین های آن آشنا باشید، ضمن اینکه باید تا حدودی با برنامه نویسی PHP کار کرده باشید و کد را به شکل یک ابزار قابل استفاده در وردپرس بازنویسی کنید!
نویسنده: جهان
زمان: ۲۱:۵۸:۲۸ - تاریخ: ۱۳۹۴/۰۸/۲۵
با سلام و عرض خسته نباشيد ميخواستم اگه براتون مقدوره يه برنامه با حلقه while برام بنويسيد كه دو عدد را بگيرد و بزرگترين مقسوم عليه مشترك آنها رو بهمون بده. تحقيق دانشجويي هستش والا رشته من برق شاغلم ممنون ميشم كمكم كنيد. با سپاس
پاسخ: 
سلام
تابع زیر در PHP برای گرفتن بزرگترین مقسوم علیه مشترک قابل استفاده است:
<?php
function getGCDBetween($a, $b){
while($b != 0){
$m = $a % $b;
$a = $b;
$b = $m;
}
return $a;
}
echo getGCDBetween(25, 10);
?>
نویسنده: behrouz
زمان: ۱۰:۲۸:۱۴ - تاریخ: ۱۳۹۴/۰۹/۲۸
تشکر خیلی مفید بود
نویسنده: محمد
زمان: ۱۹:۲۹:۱۹ - تاریخ: ۱۳۹۴/۱۰/۰۶
سلام
من خیلی تلاش کردم برای به دست اوردن جوابم نگرفتم متاسفانه
اونم اینکه می خواستم بدونم foreach سرعتش بیشتره برای فراخوانی اطلاعات از پایگاه داده یا while؟
اگر foreach سرعت بیشتری داره میشه یه نمونه کوچولو از فراخوانی ردیف ها از پایگاه داده ارسال کنید
در while اینطوری فراخوانی می کنم:
<?php
while($test=mysql_fetch_array($sql_select)){
echo $test['name'];
}
?>
میشه دقیقا مثال بالا رو در قالب foreach پیاده سازی کنید؟
ممنونم از سایت خوبتون
پاسخ: 
سلام
در کار با MySQL و اجرای پرس و جو، ابتدا باید با while نتایج حاصل را به شکل آرایه خروجی نهایی بگیریم تا در حلقه foreach قابل استفاده باشد، لذا استفاده از foreach در این حالت معمولا یک مرحله اضافه است و بهتر است صرفا در مواقع نیاز استفاده شود، مثال:
<?php
@$result = array();
while($test=mysql_fetch_array($sql_select)){
$result[] = $test;
}
//print_r($result);
foreach($result as $row){
echo $row['name'];
}
?>
نکته: در while برای هر دور می توانیم از مقادیر همان دور استفاده کنیم و نیازی نیست منتظر به پایان رسیدن حلقه باشیم.
برای درک دقیقتر مثال بالا فرض کنید خروجی نهایی متغیر result به شکل آرایه زیر است:
<?php
@$result = array(0 => array('name' => 'Ali', 'age' => 22));
foreach($result as $row){
echo $row['name'];
}
?>
نویسنده: محمد
زمان: ۲۳:۴۴:۳۶ - تاریخ: ۱۳۹۴/۱۰/۰۶
سلام
اگه دقت کرده باشید چندین نظر ارسال کردم که همشون هم در مورد سرعت بود
می خوام این سوالو بپرسم:
من یک قسمت آمارگیر قرار دادم برای سایتم
نمایش تعداد:
مطالب
نظرات
صفحات جداگانه
لینک ها
تعداد بحث ها
تعداد مطالب بیشتر از 1000 بازدید
شما پیشنهاد می کنید برای تعداد گیری از چه query استفاده کنم که سرعت افزایش پیدا کنه؟ من وقتی کدهای آمارگیر رو پاک می کنم سرعت خیلی افزایش پیدا می کنه
به صورت مثال اینطوری دارم استفاده می کنم :
<?php
$countposts=mysql_num_rows(mysql_query("select id from myposts where status='true'"));
echo 'تعداد مطالب : ',$countposts;
?>
همین کدو با مقداری تغییری تعداد نظرات و ... رو هم از جداول دیگه می گیرم می خوام بدونم فقط برای یه شمارش ساده همین دستور رو پیشنهاد می دید؟ یا دستور دیگری هم هست که بشه باهاش سرعت اجرا رو بیشتر کرد؟ دستوری که باعث افت سرعت نشه چون تعداد مطالب بالای 5 هزارتاست نظرات هم بیشتر از 200 تاست.
میشه راهنمایی کنید؟
ممنون بابت وقتی که می زارید.
پاسخ: 
سلام
برای اینگونه موارد تا آنجا که امکان دارد باید به دنبال راه های بهتری باشید، چون شمارش کل ردیف ها برای هر بار فراخوانی با توجه به تعداد بالای کاربران، به میزان زیادی دیتابیس را درگیر خواهد کرد، راه حل پیشنهادی ما این است که ابتدا ستون های از نوع TRUE یا FALSE را به صورت tinyint تعریف کنید و مقدار TRUE را با 1 و مقدار FALSE را با 0 درج نمائید، همین تغییر جزئی به صورت نسبی به بهبود عملکرد در مقیاس کلان کمک می کند، گام دوم این است که مواردی مانند تعداد مطلب و ... را در یک جدول جداگانه (به فرض جدول آمارها) داشته باشید که با ارسال هر مطلب در پنل مدیریت، یک واحد به تعداد آنها افزوده شود (یا با حذف مطلب، یک واحد کاهش داشته باشد)، به این صورت هم کاربران را در شمارش مطالب دخیل نمی کنید، هم تعداد پرس و جوهای آماری به حداقل کاهش پیدا می کتد، برای نمایش آمار نیز کافی است یک پرس و جوی SELECT داشته باشید که تعداد کل را از جدول آمارها استخراج کند (دقت کنید این حالت با حالت مد نظر شما متفاوت است، در حالت شما برای هر کاربر کل ردیف ها باید شمارش شوند، اما در اینجا صرفا مقدار یک ردیف استخراج می شود)، مشابه همین الگوریتم برای موارد دیگر مانند آمار سایت نیز قابل اجرا است، یعنی آمار کلی از قبل در جدول موجود باشد و برای هر کاربر تنها یک واحد افزایش داشته باشد!
نویسنده: erfan
زمان: ۱۹:۲۴:۵۸ - تاریخ: ۱۳۹۵/۰۲/۰۴
سلام و عرض ادب خدمت شما. این کد کد صفحه ریجستر سایتمه.. میخوام ده هزار تا یوزر توش بسازم... امکانش هست که راهنماییم کنید چطوری میشه ساخت
<form method="get" action="registration_site.xhtml" >
<input type="hidden" name="d_token" value="031e1280fe5fc436a497fce3b51f292d" />
<input type="hidden" name="do_id" value="1" />
<p>
Login:<br/>
<input type="text" name="reg_login" maxlength="100"/>
<br/>
Password<br/>
<input type="password" name="reg_pas1" />
<br/>
Verify password<br/>
<input type="password" name="reg_pas2" />
<br/>
<input type="submit" name="submit" value="Register" /></form>
پاسخ: 
اگر منظورتان صرفا چاپ 10000 فیلد ورود است، این کار با حلقه for امکانپذیر است، مثال:
<form method="get" action="registration_site.xhtml" >
<input type="hidden" name="d_token" value="031e1280fe5fc436a497fce3b51f292d" />
<input type="hidden" name="do_id" value="1" />
<p>
<?php
for($i = 1; $i <= 10000; $i++){
echo 'Login:<br/>
<input type="text" name="reg_login" maxlength="100"/>
<br/>
Password<br/>
<input type="password" name="reg_pas'. $i .'" />
<br/>
Verify password<br/>
<input type="password" name="reg_pas'. $i .'" />
<br/>';
}
?>
<input type="submit" name="submit" value="Register" /></form>
اما اگر هدف دیگری مد نظر دارید، لطفا توضیح بیشتری ارائه کنید تا امکان راهنمایی وجود داشته باشد.
نویسنده: کامران
زمان: ۲۱:۴۰:۵۹ - تاریخ: ۱۳۹۵/۰۸/۱۶
اقا گروه ندارین؟
پاسخ: 
در حال حاضر خیر!
نویسنده: نیما
زمان: ۲۱:۰۴:۰۰ - تاریخ: ۱۳۹۵/۰۹/۰۴
تشکر مطلب بسیار مفیدی بود
نویسنده: شهریار
زمان: ۱۴:۴۳:۴۲ - تاریخ: ۱۳۹۵/۰۹/۱۶
درود بر شما.
استاد می خوام مقادیر حلقه while را در یک آرایه ذخیره کنم تا بتونم اونو ارسال کنم به یک جدول یا متغیر...
یه آرایه تعریف کردم ولی فقط مقدار دور آخر حلقه را ذخیره کرد
پاسخ: 
از نمونه زیر می توانید پیروی کنید:
<?php
$num = 10;
$array = @array();
while($num < 20){
$array[] = $num;
$num++;
}
print_r($array);
?>
نویسنده: افشین
زمان: ۲۱:۵۲:۱۹ - تاریخ: ۱۳۹۶/۰۱/۱۷
با عرض ادب خدمت شما ٬ این کد را دقت کنید:
$a=1;
while ($a<=5) {
echo($a++);
}
//خروجی
12345
ولی چرا وقتی که قسمت عملگر یک واحد افزایش متغیر را برعکس میکنم ٬ تا عدد 6 چاپ میکنه؟
$a=1;
while ($a<=5) {
echo(++$a);
}
//خروجی
23456
در صورتی که در شرط نوشته شده تا مساوی 5 دیگه 6 را چرا چاپ میکنه؟ ٬ در واقع باید از عدد 2 شروع به چاپ کنه و تا 6 بره ولی چون در شرط گفتم تا 5 را چاپ کن٬ درسته به 6 میرسه ولی دیگه نباید 6 را که چاپ کنه؟
با تشکر از شما
پاسخ: 
در کد دوم متغیر a در دور پایانی برابر با 5 است، منتها قبل از اینکه خروجی چاپ شود، ابتدا مقدار a یک واحد افزایش می یابد و برابر 6 می شود، سپس خروجی چاپ می شود، این رفتار به دلیل محل قرارگیری علامت ++ است، به همین دلیل است که در خروجی دوم عدد 1 را ملاحظه نمی کنید و در دور اول 1 که مقدار اولین دور است، قبل از چاپ خروجی یک مقدار اضافه شده و شروع از 2 است.
نویسنده: امیرحسین
زمان: ۲۱:۳۷:۰۹ - تاریخ: ۱۳۹۶/۰۷/۲۰
سلام استاد عزیز
من با پی اچ پی یه حلقه بی نهایت نوشتم در سمت سرور اما همچنان فایل رو هم پاک کردم کلا کل پروژه رو از هاست پاک کردم بازم 10 ساعته که در حال اجرا هست
حلقه به این صورت بوده
while(true){
if(...){
break;
}
}
اما شرط if داخل حلقه که در شرایط خاص حلقه رو خاتمه میده ظاهرا اشتباه نوشتم و هیچوقت شرط true نمیشه و حلقه در حالت بینهایت رفته هاست بنده دایرکت ادمین هستش و نمیدونم چطوری غیرفعالش کنم. در حلقه هم گفتم یک رکورد در دیتابیس ثبت کنه اما 10 ساعته با اینکه پروژه رو کلا پاک کردم ولی هر 1 ثانیه 1 رکورد داره تو دیتابیس ثبت میکنه !
چه دستوری میفرمایید.
پاسخ: 
معمولا تنظیمات سرورها به صورتی است که حداکثر زمان اجرای اسکریپت در آنها مقدار زمان مشخص و محدودی است، اگر مشکل به خودی خود بر طرف نشود به نظر می رسد باید موضوع را با پشتیبانی هاست خود مطرح کنید، خاتمه دادن اجرای اسکریپت در این موقعیت صرفا با دسترسی سطح مدیر سرور ممکن است.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ خاصی داده نخواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لذا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.




5 × 9
 refresh
نکته:
با توجه به تاریخ نگارش آموزش های سایت و پیشرفت تکنولوژی های مرتبط با وب در سالیان اخیر، محتوای برخی از مطالب قدیمی ممکن است نیاز به ویرایش و به روزرسانی داشته باشد که این کار هم زمان با تهیه نسخه جدید «وبگو» به مرور در حال انجام است، لطفا در استفاده از مطالب سایت به این نکته دقت داشته و حتی المقدور از چند منبع مختلف استفاده نمائید.
آخرین دیدگاه ها
form حامد
در:
عالی بود
۲۱:۳۸:۳۱ ۱۳۹۸/۱۱/۰۷

form ناشناس
در:
سلام خیلی ممنون بابت پاسخ سریعتون خیلی دنبال همین دو خط کد بودم برای یادگیری سریع ریجکس ولی با سرچ پیدا نکردم و...
۱۸:۰۳:۴۳ ۱۳۹۸/۱۱/۰۷

form فرید
در:
درود بشما، میخواستم بدونم مثل کلمه @، کلمه ایی ساین هم داریم؟ با تشکر
۱۲:۱۹:۰۷ ۱۳۹۸/۱۱/۰۷

form ناشناس
در:
سلام میشه لطفا به سوالم جواب بدید من می خوام با استفاده از عبارات با قاعده تمام تگ های html رو تشخیص بدم...
۱۰:۱۳:۰۵ ۱۳۹۸/۱۱/۰۷

form PewDiePie
در:
سلام چطور می تونم این کد رو یه لینک هم بهش اضافه کنم یعنی این که وقتی عکس رو می بینی طرف بتونه...
۲۳:۳۶:۲۶ ۱۳۹۸/۱۱/۰۶

form رسول
در:
سلام میخوام بجای نمایش متن، متن موجود در یه لینکو بهم نشون بده ممنون میشم کمکم کنید
۱۳:۳۸:۱۸ ۱۳۹۸/۱۱/۰۶

form حسن
در:
من مطابق کد نوشته شده شما میخواستم آدرس
۱۴:۱۰:۱۳ ۱۳۹۸/۱۱/۰۵

form saemrezaei
در:
سلام واقعا عالییه خیلی استفاده کردم به وبلاگم سر بزن لطفا.
۱۳:۳۷:۳۴ ۱۳۹۸/۱۱/۰۵

form نصراله رضایی
در:
سلام در ادمین های گذشته که باز می کنم تصاویر مشاهده نمی شود و من را به آدرس Huge domains.com ارجاع می...
۲۲:۳۹:۵۳ ۱۳۹۸/۱۱/۰۴

form نقدی زاده
در:
واقعا مرسی یه overflow-y:hidden به body دادم اسکرل افقی برای صفحه نمایش تبلت از بین رفت
۱۴:۴۴:۱۳ ۱۳۹۸/۱۱/۰۴

form وحید پوربشیری
در:
سلام لطفا یکی که خوب جاوا اسکریپت بلده بیاد به این آیدی ت.ل.گ.ر.ا.م Alpha2020@ یه کد برام بنویسه پول هم میدم
۱۱:۱۲:۳۲ ۱۳۹۸/۱۱/۰۲

form امین
در:
سلام تشکر بابت راهنماییتون. منظور من این بود که: الان با ثبت نام کاربر a در سایت اطلاعاتش در دیتابیس ثبت میشه و یک پوشه...
۰۳:۱۲:۴۰ ۱۳۹۸/۱۱/۰۲

form شریفی
در:
سلام معنی متن زیر چیست؟
۱۸:۲۸:۰۹ ۱۳۹۸/۱۱/۰۱

form امین
در:
سلام خسته نباشید یه اسکریپت دارم که وقتی کاربر ثبت نام میکنه یه پوشه و محتواش ایجاد میشه. میخوام یه صفحه با هر ثبت نام...
۱۴:۱۸:۵۱ ۱۳۹۸/۱۰/۳۰

form Admin
در:
سلام دوست عزیز. میشه بگویید چگونه میتوان در وبلاگ کادری را باز کرد که بازدید کنندگان بتوانند در آن چیزی بنویسند. ممنون میشم...
۱۱:۲۸:۵۰ ۱۳۹۸/۱۰/۳۰
آگهی