# কন্ট্রোল স্ট্রাকচারস

কন্ট্রোল স্ট্রাকচার - নাম শুনেই আন্দাজ করা যায় কন্ট্রোল রিলেটেড ব্যাপার । একটা পিএইচপি প্রোগ্রামের ফ্লো কন্ট্রোল করাই কন্ট্রোল স্ট্রাকচারের কাজ । আমরা জানি পিএইচপিতে আমাদের কোড লাইন বাই লাইন এক্সিকিউট করা হয় । কখনো কখনো আমাদের এই এক্সিকিউশন কোন শর্তের উপর নির্ভর করে । শর্ত সাপেক্ষে প্রোগ্রাম এর কোন অংশটুকু পিএইচপি এক্সিকিউট করবে সেটা আমরা এই কন্ট্রোল স্ট্রাকচারগুলোর মাধ্যমে নির্ধারণ করে দিবো ।

### কোড ব্লক

পিএইচপিতে আমরা কয়েকটা স্টেটমেন্টকে একটা গ্রুপ কিংবা ব্লক আকারে ডিফাইন করতে পারি কার্লি ব্রেইস (`{ }`) ব্যবহার করার মাধ্যমে । ব্লক তৈরি করার সুবিধা হলো যখন কোন শর্ত সাপেক্ষে নির্দিষ্ট কিছু স্টেটমেন্ট রান করতে হয় তখন আমরা ঐ স্টেটমেন্টগুলোকে একটি কোড ব্লকে রেখে পিএইচপি কে বলে দেই অমুক ঘটনা সত্য হলে এই কোড ব্লকের ভিতরে রাখা স্টেটমেন্ট রান করতে । কন্ট্রোল স্ট্রাকচারের সাথে কোড ব্লকের সম্পর্ক গভীর ।

### ইফ, এলস (If, Else)

কোন একটি বিশেষ শর্ত সাপেক্ষে কোন কোড ব্লক এক্সিকিউট করতে আমরা ইফ, এলস ব্যবহার করি । ইফ এর পরে আমরা একটি এক্সপ্রেশন দেই, এটি যদি সত্য হয় (অর্থাৎ এটার বুলিয়ান ভ্যালু `true` হয়) তাহলে ইফ ব্লক রান করে । যদি আমরা সাথে একটি এলস ব্লকও দিয়ে দেই, তাহলে ইফ স্টেটমেন্ট `false` হলে এই বিকল্প ব্লক টি রান করে ।

উদাহরণ:

```php
<?php

$age = 10; 

if($age > 18) {
    echo "You are an adult!";
} else {
    echo "You are not an adult yet!";
}
```

এখানে আমরা একটি ভ্যারিয়েবল নিয়েছি `$age` এরপর ইফ ব্লকে আমরা চেক করছি এই ভ্যারিয়েবল এর মান ১৮ অপেক্ষা বেশি কিনা । যদি ১৮ অপেক্ষা বেশি হয় তাহলে প্রথম ব্লক রান করবে । যদি না হয় তবে দ্বিতীয় ব্লক । উপরের কোডটি রান করলে আমরা দেখবো এলস ব্লক রান করেছে কারন এই ভ্যারিয়েবল এর মান আমরা শুরুতেই ১০ নির্ধারণ করে দিয়েছি যেটা নি:সন্দেহে ১৮ থেকে বড় না ।

আমরা চাইলে একাধিক শর্তও যোগ করতে পারি `elseif` ব্যবহার করে । এসব ক্ষেত্রে প্রথমে ইফ ব্লক চেক করা হবে, এটা যদি সত্য না হয় তাহলে এলসইফ ব্লকগুলো একটা একটা করে চেক করা হবে । যদি কোনটাই `true` না হয় তাহলেই এলস ব্লকের কোড রান করবে । যেমন:

```php
<?php
if ($a > $b) {
    echo "a is bigger than b";
} elseif ($a == $b) {
    echo "a is equal to b";
} else {
    echo "a is smaller than b";
}
```

পুনশ্চ: একটি ইফ বা এলস কোড ব্লকের মধ্যে চাইলে আরো ইফ এলস ব্লক যোগ করা যায় । এটাকে নেস্টেড ব্লক বলা হয় ।

### হোয়াইল লুপ (While)

লুপ কি জিনিস তা আমরা সবাই কম বেশি জানি । হোয়াইল লুপের কাজ হচ্ছে আমাদের দিয়ে দেওয়া এক্সপ্রেশন যতক্ষণ পর্যন্ত সত্য হবে ততক্ষন পর্যন্ত সাথে দেওয়া কোড ব্লকটি এক্সিকিউট করা । প্রতিবার লুপ এর শুরুতে ঐ এক্সপ্রেশনটি পিএইচপি চেক করবে, যদি সত্য হয় তাহলে কোড ব্লকটি রান করবে, কোড ব্লক রান করা শেষ হলে সে আবার এক্সপ্রেশনটি চেক করবে - এভাবে চলতেই থাকবে যতক্ষণ পর্যন্ত ঐ এক্সপ্রেশন `true` রিটার্ন করবে । সুতরাং আমরা বুঝতে পারছি যদি আমাদের লুপ ভেঙ্গে বের হতে হয় তাহলে এমন কোন পরিবর্তন আনতে হবে যাতে ঐ এক্সপ্রেশন এর ভ্যালু আর সত্য না হয় । উদাহরণ দেখে নেই:

```php
<?php

$i = 1;
while ($i <= 10) {
    echo $i++;  
}

echo "I am outside the loop";
```

এই উদাহরণে দেখুন, আমরা শুরুতে `$i` এর ভ্যালু দিয়েছি ‍১ । এরপর হোয়াইল লুপে শর্ত দিয়েছি যে `$i` এর ভ্যালু যতক্ষন ১০ এর ছোট বা সমান হবে ততক্ষণ পর্যন্ত যেন সে কোড ব্লকটি রান করে । লক্ষ্য করুন এই কোড ব্লকের ভিতরে আমরা `$i` এর ভ্যালু শুধু আউটপুটই দেইনি, সেই সাথে এটার ভ্যালু ১ করে বাড়িয়ে দিয়েছি । প্রতিবার লুপের শুরুতে পিএইচপি চেক করবে ভ্যারিয়েবলটার ভ্যালু ১০ থেকে কম কিনা, এরপর সে ভ্যালুটা আউটপুট দিয়ে সাথে ১ যোগ করে দিবে । এভাবে লুপ চলতে চলতে একটা সময় এসে `$i` এর ভ্যালু বাড়তে বাড়তে ১০ এর বেশি হয়ে যাবে । তখন আর হোয়াইল লুপে দেওয়া শর্ত সত্য থাকবে না, পিএইচপি তখন লুপ থেকে বের হয়ে পরবর্তী কোড এক্সিকিউট করা শুরু করবে ।

### ডু-হোয়াইল লুপ (do-while)

আমরা দেখেছি হোয়াইল লুপ প্রথমেই শর্তটি চেক করে । যদি সত্য হয় তবেই সে কোড ব্লক রান করে । যদি এমন হয় যে প্রথমবারেই শর্তটি মিথ্যা হলো, তখন? তখন আর কোড ব্লকটি একবারো রান করবে না । ডু-হোয়াইল লুপের ব্যাপারটা একটু ভিন্ন । এখানে আমরা প্রথমে কোড ব্লক দিয়ে দেই, পিএইচপি এটা রান করে আগে, এরপর হোয়াইল লুপের কন্ডিশন টা চেক করে । যদি সত্য হয় তাহলে আবার কোড ব্লক রান করে, সত্য না হলে লুপ ভেঙ্গে বের হয়ে যায় ।

যেহেতু ডু-হোয়াইল লুপে কোড ব্লক প্রথমে রান করে এবং এক্সপ্রেশন এর ভ্যালু পরে চেক করা হয় তাই নিশ্চিতভাবে বলা যায় যে প্রদত্ত কোড ব্লকটি অন্তত একবার রান করবেই । ঠিক এই একবার রান করা নিশ্চিত করার জন্যই হোয়াইল এর পরিবর্তে ডু-হোয়াইল ব্যবহার করা হয় ।

কোড এক্সাম্পল দেখে নেই:

```php
<?php
$i = 0;
do {
    echo $i;
} while ($i > 0);
```

দেখুন এখানে `$i` এর ভ্যালু ০ অপেক্ষা বেশি না হলেও কোড ব্লকটি রান করে এবং ০ আউটপুট দেয় ।

### ফর লুপ (for)

এটা একটু তুলনামূলকভাবে জটিল লুপ । এখানে আমরা ৩টা এক্সপ্রেশন দিয়ে দেই -

* প্রথমটা যখন প্রথমবার লুপ শুরু হবে তখন রান করা হবে ।&#x20;
* ২য় টা হচ্ছে লুপের মূল শর্ত, হোয়াইল লুপের মত প্রতিবার লুপ শুরু হওয়ার সময় এটা চেক করা হবে । এটার বুলিয়ান ভ্যালু `true` হলেই কেবল লুপটি চলবে ।&#x20;
* ৩য়টা প্রতিবার কোড ব্লক শেষ করে রান করা হয় ।&#x20;

আমরা খুব সিম্পল একটা উদাহরণ দেখে নেই:

```php
<?php
for ($i = 1; $i <= 10; $i++) {
    echo $i;
}
```

এখানে,

* `$i = 1` এটা লুপ প্রথমবার শুরু হওয়ার সময়ই রান করবে । অর্থাৎ আমরা `$i` এর ভ্যালু ১ সেট করে নিলাম ।&#x20;
* এবার হলো শর্ত পরীক্ষা করার পালা । প্রতিবার লুপের শুরুতে চেক করা হবে `$i` এর ভ্যালু ১০ এর সমান কিংবা কম আছে কিনা । থাকলে কোড রান করবে, না হলে লুপ শেষ করে বের হয়ে যাবে ।&#x20;
* প্রতিবার লুপ শেষে আমরা ভ্যারিয়েবলটির ভ্যালু ১ করে বাড়িয়ে দিচ্ছি যাতে একটা সময় গিয়ে এটার ভ্যালু ১০ এর বেশি হয় ।&#x20;

সংক্ষেপে এটাই হলো ফর লুপের কাহিনী । আমরা চাইলে যে কোন এক্সপ্রেশন ফাকা রাখতে পারি । যদি আমরা ভুলে বা ইচ্ছাকৃতভাবে ২য় এক্সপ্রেশনটি ফাকা রাখি, সেক্ষেত্রে ফর লুপটি চলতেই থাকবে কেননা এটি কতক্ষন পর্যন্ত চলতে হবে সেই নির্দেশনটা আমরা পিএইচপি কে দেই নি ।

### ফর-ইচ লুপ (foreach)

কোন এ্যারে থেকে ভ্যালুগুলোকে একটা একটা নিয়ে কাজ করার জন্যই ফর-ইচ লুপ ব্যবহার করা হয় । এই লুপের এক্সপ্রেশন হিসেবে আমরা বলে দেই একটি এ্যারে থেকে কিভাবে প্রতিটা আইটেম নিতে হবে । এরপর সেই নির্দেশনা অনুযায়ী পিএইচপি আইটেমগুলোকে একটা একটা করে আমাদের কোড ব্লকে পাস করে । প্রতি লুপে এভাবে আমরা এ্যারের একেকটি আইটেম পাই । যতক্ষণ পর্যন্ত ঐ এ্যারের সবগুলো আইটেম একবার করে নেওয়া না হবে ততক্ষণ পর্যন্ত এই লুপ চলতেই থাকবে ।

আমরা আমাদের এক্সপ্রেশন এ বলে দিতে পারি যে আমরা কি শুধু এ্যারের ভ্যালুটা চাই নাকি ইনডেক্স ভ্যালু দুটোই চাই । নিচের উদাহরণ দেখি:

```php
<?php

// এই উদাহরণে শুধুই আইটেম টি নিবো
$arr = array(1, 2, 3, 4);
foreach ($arr as $value) {
    echo $value;
}

// এখানে আমরা ইনডেক্স এবং ভ্যালু দুটোই নিবো
$arr2 = array("a" => "abdullah", "b" => "bahar");
foreach($arr2 as $k => $v) {
    echo $k. "=". $v;
}
```

প্রথম উদাহরণে আমরা পিএইচপিকে বলে দিচ্ছি `$arr` এ্যারে থেকে একেকটি আইটেম নিয়ে সেটিকে `$value` ভ্যারিয়েবলে রাখতে । এরপর কোড ব্লকটি রান করতে । ২য় উদাহরণে, আমরা বলে দিচ্ছি ইনডেক্স এর ভ্যালু টা `$k` এবং আইটেম এর ভ্যালুটা `$v` ভ্যারিয়েবলে রেখে কোড ব্লকটি রান করাতে ।

### সুইচ (switch)

সুইচ ব্যবহার করে আমরা খুব সহজে কোন একটা এক্সপ্রেশন এর ভ্যালুর উপর নির্ভর করে অনেকগুলো সিদ্ধান্ত থেকে এক বা একাধিক বেছে নিতে পারি । এর আগে আমরা ইফ-এলস, এলস-ইফ এর ব্যবহার দেখেছি । যখন অনেকগুলো শর্ত পরপর চেক করার প্রয়োজন হয় তখন আমরা এলস-ইফ ব্যবহার করি, অনেকটা নিচের মত করে -

```php
<?php
if ($i == 0) {
    echo "i equals 0";
} elseif ($i == 1) {
    echo "i equals 1";
} elseif ($i == 2) {
    echo "i equals 2";
}
```

সাধারনত এরকমভাবে একগাদা এলস-ইফ ব্লক এ্যভয়েড করার জন্য সুইচ পারফেক্ট । এখানে আমরা কয়েকটা কন্ডিশন চেক করছি, প্রথমে দেখছি `$i` এর ভ্যালু শুন্য কিনা, এরপর চেক করছি এটির মান ১ কিনা, এরপর আবার দেখছি ২ কিনা । সুইচ এর মাধ্যমে এভাবে বার বার চেক না করে, একবারেই চেক করে মান অনুসারে সিদ্ধান্ত নেওয়া যায় । উপরের কোডই আমরা সুইচ ব্যবহার করে এভাবে লিখতে পারি -

```php
<?php
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
}
```

এখানে, আমরা `$i` এর ভ্যালুর উপর নির্ভর করে আমাদের সিদ্ধান্ত নিবো তাই এটাকে সুইচ এ পাস করা হয়েছে । এরপর আমাদের কোড ব্লকের ভিতরে কতগুলো `case` বা সম্ভাব্য ঘটনা বিচার করা হয়েছে । `case` এর সাথে আমরা প্রত্যাশিত ভ্যালু দিয়ে একেকটি কেইস ডিফাইন করি । যেমন, `case 0` মানে হলো `$i` এর মান যখন 0 হবে তখন এই কেইসটি সত্য । এরপর কোলন (`:`) দিয়ে আমরা আমাদের প্রয়োজনীয় কোড লিখি । এখানে আমরা একটা আউটপুট দিয়ে রেখেছি । এরপর যে কোন কেইস মিলে গেলে আমরা চাই সুইচ ব্লক থেকে বের হয়ে যেতে, তাই `break` এর ব্যবহার । `break` সম্পর্কে আমরা একটু পরেই জানবো । আপাতত জেনে রাখি, কোন কেইস এর পর ব্রেক না থাকলে ঐ কেইসটি ম্যাচ করেই পিএইচপি থেমে যাবে না, বরং পরবর্তী কেইসগুলাও ম্যাচ করে দেখবে । একাধিক কেইসও এভাবে ম্যাচ করা সম্ভব । তবে অধিকাংশ ক্ষেত্রেই আমরা চাইবো একটি কেইস ম্যাচ করলে সুইচ থেকে বের হয়ে যেতে ।

### ব্রেক (break)

যে কোন ধরণের কন্ট্রোল স্ট্রাকচার থেকে বের হয়ে আসতে ব্রেক ব্যবহার করা হয় । যেমন:

```php
<?php
$array = ["a", "b", "c", "d"];
foreach($array as $val) {
    echo $val;
    if($val == "b") {
        break;
    }
}
```

এই উদাহরণে আমরা দেখছি, এ্যারে থেকে সবগুলো আইটেম নেওয়ার আগেই লুপটি বন্ধ হয়ে যাচ্ছে, কারণ যখনই আইটেম এর ভ্যালু `b` হচ্ছে তখনই আমরা `break` স্টেটমেন্ট ব্যবহার করে লুপ থেকে বের হয়ে আসছি । ফলে বাকি আইটেমগুলো আর আউটপুটে আসছে না ।

### কন্টিনিউ (continue)

ব্রেক এর কাজ লুপ থেকে বের হয়ে যাওয়া, কন্টিনিউ এর কাজ বর্তমান লুপের বাকি অংশ স্কিপ করে সরাসরি পরবর্তী লুপ শুরু করা ।

```php
<?php
for ($i = 0; $i < 5; ++$i) {
    if ($i == 2) {
        continue; 
    }
    print "$i\n";
}
```

এই কোডটি রান করলে 2 আউটপুটে আসবে না, কারণ যখনই `$i` এর ভ্যালু ২ হবে তখনই পিএইচপি কন্টিনিউ স্টেটমেন্টটি দেখবে । তখন আর কোড ব্লকের বাকি অংশ রান না করেই পরবর্তী লুপে প্রবেশ করবে । তাই `print "$i\n";` এই অংশটি ২ এর বেলায় এক্সিকিউট করা হবে না, আউটপুটেও তাই ২ আসবে না । অর্থাৎ লুপিং এর সময় কন্টিনিউ ব্যবহার করলে পিএইচপি সাথে সাথে ব্লকের বাকি অংশ স্কিপ করে পরবর্তী আইটেমে চলে যায় ।

## এক্সারসাইজ

1. একটা স্ক্রিপ্ট লিখেন যেটা চলতি মাসের নাম নিবে এবং তার উপর ভিত্তি করে নিচের মেসেজ প্রিন্ট করবে।&#x20;
   * যদি মাসের নাম November হয় তাহলে প্রিন্ট করবে,  Winter is comming.
2. যদি November না হয়, তাহলে প্রিন্ট করবে, You better stay in South.&#x20;

&#x20;**হিন্টস :** date('F', time()) এইটা ব্যবহার করে অাপনি, মাসের নাম নিতে পারবেন।

2.ধরুন অাপনি Zimbabwe এর একজন বাসিন্দা । অাপনার বন্ধু বিভিন্ন দেশে ঘুরে ঘুরে খেলা দেখে । সে অাপনাকে একদিন বলল, " ওমুক দেশটা খুব সুন্দর "। বন্ধুর কথা শুনে, অাপনার ঐদেশে ঘুরতে যেতে ইচ্ছে হল। কিন্তু সে অাপনাকে দেশেটির নাম বলেনি। বরং অাপনাকে একটি চিরকুট দিল। যাতে লেখা - "Bangladesh is beautiful country" । এবং সে অাপনাকে কতগুলো দেশের নামের লিস্ট দিল যেগুলো হল -"England", "Bangladesh", "Sri Lanka", "India" ।

এখন এই দুটো তথ্যের উপর ভিত্তি করে অাপনাকে ঐদেশের নাম কি সেটা বলতে হবে।

&#x20;**হিন্টস :** স্ট্রিং কে অ্যারেতে কনভার্ট করার জন্য explode() ফাংশনটি ব্যবহার করতে পারেন। ডিটেইলস : <http://php.net/manual/en/function.explode.php>

অামরা পরবর্তিতে অারোও এক্সারসাইজ দেয়ার চেষ্টা করব।


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://php.howtocode.dev/control-structures.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
