PDA

View Full Version : استفاده از if درون دستوری مثل forیاforeach



Salazar.mi
دوشنبه 06 آبان 1398, 14:16 عصر
سلام
من یک سری شرط دارم مثلا


$data===1 && $dg===0

حالا 3 مقدار از یک آرایه دارم که این شرط ها را دارند (کل آرایه 64 خانه است)
من میخوام بیاد به ازای هر خونه از آرایه ام که این شرایط را دارند که اینجا میشه سه خانه
یه فرمول را محاسبه کند
مثلا


$v=$w0+($w1*$x1)+($w2*$x2);

حالا تو هر خانه از آن سه خانه که این فرمول مقدارش بیشتر شد اون خانه را انتخاب کنه مثلا به جاش بنویسه ok
و اگر مقدار فرمول برای سه خانه با هم برابر شد بیاد از بین اون سه خانه یکیشو رندوم انتخاب کنه و به جاش بنویسه ok
به نظر خودم راهش اینه
استفاده از if درون دستوری مثل for یا foreach
اما چجوری نمیدونم

ali_sed
دوشنبه 06 آبان 1398, 17:26 عصر
چیزی شبیه به برنامه زیر می شود در صورتی که حاصل فرمول مساوی با قبلی باشد همان قبلی را در نظر میگیرد که می توانید خودتان رندوم یکی را انتخاب کند.


$find = new stdClass();
foreach($a as $i=>$row){
foreach($row as $j=>$data){
if($data===1 && $dg===0){
$v=$w0+($w1*$x1)+($w2*$x2);
if(!isset($find->value) || $v > $find->value){
$find->value = $v;
$find->i = $i;
$find->j = $j;
}
}
}
}

var_dump($find );

Salazar.mi
دوشنبه 06 آبان 1398, 21:08 عصر
بی نهایت ممنونم که جواب دادین
فقط میشه لطفا یک کم در مورد چیزی که نوشتین توضیح بدین لطفا

ASHKANLAEI
سه شنبه 07 آبان 1398, 07:32 صبح
ببینید شما باید یک آرایه درست کنید که سه عدد توش باشه. یکی سطر خونه، یکی ستون و آخری هم حاصل فرمول برای اون خونه.
سپس در هر خانه (در صورت data===1 && $dg===0) باید بیاین و حاصل فرمول رو دو بار با حاصلی که در آرایه ذخیره شده مقایسه کنین.
یک بار برای بزرگ تر بودن که باید مقادیر این خونه رو با مقادیر آرایه جایگزین کنه، و یک بار (اگر شرط قبل غلط بود) از نظر برابر بودن که اگر درست بود به صورت رندوم (کد پیدا کردن بولین رندوم:
(rand(0,1) >= 0.5)) بیاد و ببینه میخواد جای این خونه رو در آرایه بنویسه یا همون خونۀ فعلی که در آرایه هست رو نگه داره.
این برداشتی هست که من از کد شما کردم. اگر نیاز به کد داشتین بگین تا بنویسم.

فقط میشه لطفا یک کم در مورد چیزی که نوشتین توضیح بدین لطفا
این کد نیاز به یک کلاس با نام stdClass داره که خودتون باید بسازین؛ در واقع برای اینه که سطر، ستون و مقدار فرمول خونۀ منتخب رو نگه داریم (که من با آرایه انجام دادم).
بعدش هم دو حلقه برای بررسی هر خونه از نظر ستون و سطر گذاشتن.
داخل اون ها هم (داخل همون شرطی که گفتین) فرمول اون خونه رو با مقدار قبلی متغیر، مقایسه و در صورت بزرگ تر بودن، جایگزین کرده.

Salazar.mi
سه شنبه 07 آبان 1398, 13:33 عصر
ببینید شما باید یک آرایه درست کنید که سه عدد توش باشه. یکی سطر خونه، یکی ستون و آخری هم حاصل فرمول برای اون خونه.
سپس در هر خانه (در صورت data===1 && $dg===0) باید بیاین و حاصل فرمول رو دو بار با حاصلی که در آرایه ذخیره شده مقایسه کنین.
یک بار برای بزرگ تر بودن که باید مقادیر این خونه رو با مقادیر آرایه جایگزین کنه، و یک بار (اگر شرط قبل غلط بود) از نظر برابر بودن که اگر درست بود به صورت رندوم (کد پیدا کردن بولین رندوم:
(rand(0,1) >= 0.5)) بیاد و ببینه میخواد جای این خونه رو در آرایه بنویسه یا همون خونۀ فعلی که در آرایه هست رو نگه داره.
این برداشتی هست که من از کد شما کردم. اگر نیاز به کد داشتین بگین تا بنویسم.

این کد نیاز به یک کلاس با نام stdClass داره که خودتون باید بسازین؛ در واقع برای اینه که سطر، ستون و مقدار فرمول خونۀ منتخب رو نگه داریم (که من با آرایه انجام دادم).
بعدش هم دو حلقه برای بررسی هر خونه از نظر ستون و سطر گذاشتن.
داخل اون ها هم (داخل همون شرطی که گفتین) فرمول اون خونه رو با مقدار قبلی متغیر، مقایسه و در صورت بزرگ تر بودن، جایگزین کرده.
سلام
بی نهایت ممنونم که جواب دادین
نگاه کنید من یه آرایه دارم که خانه های جدولمه
و برای دستیابی به خونه هاش اومدم دوتا حلقه for تو در تو نوشتم
الان با کدی که که گذاشته شده یعنی من برای این قسمت باید بیام دوتا foreach داخل اون دوتا for تو در تو بزارم
من کل چیزی که میخوام بنویسم را توی تاپیک دیگه نوشتم
لطفا اگر امکانش هست یه نگاهی بهش کنید ممنون میشم
https://barnamenevis.org/showthread.php?558358-%D8%A8%D8%A7%D8%B2%DB%8C-%DA%86%DA%A9%D8%B1%D8%B2-%D8%A8%D8%A7-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-minimax-%D8%A8%D8%A7-%DB%8C%DA%A9-%D8%B9%D9%85%D9%82-%D8%A8%D8%B1%D8%A7%DB%8C-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C&p=2423483#post2423483

ASHKANLAEI
سه شنبه 07 آبان 1398, 14:16 عصر
نگاه کنید من یه آرایه دارم که خانه های جدولمه
و برای دستیابی به خونه هاش اومدم دوتا حلقه for تو در تو نوشتم
الان با کدی که که گذاشته شده یعنی من برای این قسمت باید بیام دوتا foreach داخل اون دوتا for تو در تو بزارم
نه، به هیچ وجه.
اون دو حلقه با این دو تا، در کاربرد فرقی ندارن فقط برای نشون دادن این که کجا باید کد ها رو بنویسید حلقه ها نوشته شده بود.

Salazar.mi
سه شنبه 07 آبان 1398, 14:52 عصر
نه، به هیچ وجه.
اون دو حلقه با این دو تا، در کاربرد فرقی ندارن فقط برای نشون دادن این که کجا باید کد ها رو بنویسید حلقه ها نوشته شده بود.
یعنی طبق کدی که نوشته شده
میاد با دوتا foreach به هر خونه دسترسی پیدا میکنه
شرط را براش چک میکنه اگر شرط را داشت فرمول v را براش حساب مبکنه
بعد میگه اگر find مقداری نداشت یا متغیر v مقدارش از find بیشتر شد
(یعنی همون چیزی که ما میخواهیم) بیا مقدار find را بزار این جدید
فقط الان دو خط بعدی چی کار میکنه؟؟؟؟
شرمنده انقدر سوال میپرسم
ممنون میشم جواب بدین


$find->i = $i;
$find->j = $j;

یعنی کل آرایه a مون الان تو متغیر find قرار دارد آیا؟؟؟؟؟؟؟؟؟؟؟

میشه این دو خطم بگین


foreach($a as $i=>$row){
foreach($row as $j=>$data){

ASHKANLAEI
سه شنبه 07 آبان 1398, 16:16 عصر
میشه این دو خطم بگین


این که همون ساختار foreach هست کمی فکر کنید خودتون هم میفهمید. یعنی $a همون آرایه کلی هستش. $row هم هر بار میشه یکی از آرایه های داخل اون اصلیه. و data هم داخل دو حلقه، میشه هر خونه. j و i هم سطر و ستون خونه هستند.


یعنی کل آرایه a مون الان تو متغیر find قرار دارد آیا؟؟؟؟؟؟؟؟؟؟؟

خیر! i و j دو متغیر در کلاس stdClass هستند و ربطی به حلقه ندارند و در find هم فقط یکی از اون ها هست. در واقع مانند دو متغیر جدا هستند که برای گروه بندی، تو find قرار گرفتند. و find یک متغیر جدا هست که ربطی به آرایه های شما نداره. تقریباً شبیه به آرایه زیر کار میکنه:

$find = array("i" => 0, "j" => 0, "value" => 0)
و پیشنهاد میکنم شما به واژه های جدید که بر میخورین، برید به گوگل و با جستجو، قطعاً به جواب میرسین.

Salazar.mi
سه شنبه 07 آبان 1398, 16:45 عصر
این که همون ساختار foreach هست کمی فکر کنید خودتون هم میفهمید. یعنی $a همون آرایه کلی هستش. $row هم هر بار میشه یکی از آرایه های داخل اون اصلیه. و data هم داخل دو حلقه، میشه هر خونه. j و i هم سطر و ستون خونه هستند.

خیر! i و j دو متغیر در کلاس stdClass هستند و ربطی به حلقه ندارند و در find هم فقط یکی از اون ها هست. در واقع مانند دو متغیر جدا هستند که برای گروه بندی، تو find قرار گرفتند. و find یک متغیر جدا هست که ربطی به آرایه های شما نداره. تقریباً شبیه به آرایه زیر کار میکنه:

$find = array("i" => 0, "j" => 0, "value" => 0)
و پیشنهاد میکنم شما به واژه های جدید که بر میخورین، برید به گوگل و با جستجو، قطعاً به جواب میرسین.
ممنونم که جواب دادین
من سرچ کردم ,خواندم ولی راستش نفهمیدم دقیقا چیکار میکنه
فقط یه چیزی بپرسم
اگر امکانش بود جواب بدین
میشه به جای $dg===0 که نشان دهنده سطر قبل و ستون قبل بنویسیم


$a[($i-1)][($j-1)]

ASHKANLAEI
سه شنبه 07 آبان 1398, 17:45 عصر
بله، شما در خلاقیت، به هیچ وجه محدودیت ندارید. این بستگی به خودتون داره که از متغیر استفاده کنید یا مقدارش رو مستقیم فراخوانی کنید