পিএইচপি এ্যারে পরিচিতি – প্রথম পর্ব

“মামা-চাচা না থাকলে কিচ্ছু হয়না!”, ছোটবেলা থেকেই এই মহান বানী দেখে-শুনেই বড় হয়েছি। বিশেষ বিশেষ কাজে এ্যারে ধরছি, অরে ধরেছি। কখনো উপরে উঠেছি, আবার কখনো গর্তে পরেছি। সব সময় চাইতাম এ্যারে-অরেকে জীবন থেকে মুছে ফেলতে। যেভাবে ছোট বেলায় কাকের ঠ্যাং, বকের ঠ্যাং লেখাগুলো ইরেজার দিয়ে মুছে ফেলতাম ঠিক তার থেকেও কঠিনভাবে। অনেক শ্রমের বিনিময়ে একটি মুছতে পারলেও অন্যটি পারিনি 🙁 । তাইতো মনের দুঃখে গানের সুরে বলতে ইচ্ছে করে “অনেক সাধনার পরে আমি পেলাম মুছতে অরেকে, পারিনি মুছতে এ্যারেকে আমি তাড়া করে আমাকে”!

ঠিকাছে ঠিকাছে! আমার জন্য আর সমবেদনা দেখাতে হবে না। আমাকে এ্যারে তাড়া করলেও আমি আর দুঃখিত নই, বুঝলেন! কারণ এ এ্যারে সে এ্যারে নয়, এ এ্যারে পিএইচপি এ্যারে, হি হি 😀 । এবার একটু সিরিয়াস কথা বলি, ওকে? পিএইচপিতে এ্যারে হচ্ছে অনেকটা গিরিগিটি টাইপের! যেমন- বহুরুপে থাকতে পারে, নানান সাজে সাজতে পারে, নানান ঠঙে ঠং করতে পারে। সত্যি বলছি কিন্তু! এ্যারে কখনো কী-ভ্যালু হিসেবে থাকে, কখনোবা ইনডেক্স-ভ্যালু হিসেবে থাকে। কখনো আবার ১টি, ২টি কিংবা n সংখ্যক আকারে নিজেই নিজের ভিতর থাকে 😮 । কী অবাক করা বিষয়, তাই না! তাই আপনি যদি একে নারীর মন হিসেবেও ভাবেন তবুও পারফেক্ট হবে, ১০০ তে পুরোই ১০০। তাই আবারো গানের সুরে বলতে ইচ্ছে করছে “এ্যারেরে বুঝতে পারলে ভালো করে এগিয়ে নিবে আপনারে”।

এসো এ্যারে শিখিঃ

বাংলা বর্ণগুলি যেমন স্বরবর্ণ এবং ব্যঞ্জনবর্ণে ভাগ করা, তেমনি এ্যারে নিউমেরিক (Numeric) এবং এ্যাসোসিয়েটিভে (Associative) ভাগ করা। এর সাথে আরও একটা ভাগ আছে, যাকে বলে এমডি এ্যারে! মানে মাল্টি-ডায়মেনশনাল এ্যারে।

নিউমেরিক এ্যারে (Numeric Array) অনেকটা প্রাইমারি স্কুলের ক্লাস রোলের মত। যেমনঃ ১ => সুরভী, ২ => লিটন, ৩ => মমিন। কি এই তিনজনকে চিনতে পারছেন না? চিনতে না পারলে বীজগনিতের x, y ধরাধরির মত ধরে নিন এই তিনজন ছিল আমার প্রাইমারীর টপার। আমার রোল কত ছিল জানতে চাইবেন না? আচ্ছা জানতে না চাইলেও বলছি, আমি অনেক কষ্টে ২০ এর মধ্যে লাকি ৭ নিয়ে বেঁচে ছিলাম 😛 । যেহেতু এখনো বেঁচে আছি নিউমেরিক এ্যারে এবং ক্লাস রোলের পার্থক্যটা বলেই দেই, কি বলেন? পার্থক্য হল, ক্লাস রোল শুরু হয় ১ থেকে আর নিউমেরিক এ্যারে শুরু হয় শূন্য “0” থেকে। অর্থাৎ আমার প্রাইমারির টপারদের নিউমেরিক এ্যারে বানালে সুরভী হত জিরো আর আমি হতাম হিরো 😛 । থুক্কু, আমি হতাম ৬ আর টপাররা হত ০ => সুরভী, ১ => লিটন, ২ => মমিন। নিউমেরিক এ্যারেতে রোল হল ইনডেক্স (Index) আর নাম হল ভ্যালু (Value)

এ্যাসোসিয়েটিভ এ্যারে (Associative Array) আমাদের মন্ত্রীসভার মত। যেমনঃ প্রধানমন্ত্রী => শেখ হাসিনা, অর্থমন্ত্রী => আবুল মাল, কৃষিমন্ত্রী => মতিয়া চৌধুরী … (মন্ত্রীদের বিশাল লিস্ট, অলসতার খাতিরে এড়িয়ে গেলাম)। মন্ত্রীসভার এ্যাসোসিয়েটিভ এ্যারে বানালে প্রধানমন্ত্রী, অর্থমন্ত্রী, কৃষিমন্ত্রী এসব হবে কী (Key) এবং শেখ হাসিনা, আবুল মাল আর মতিয়া চৌধুরী এসব হবে ভ্যালু (Value)

মনে আছে, শুরুতে বলেছিলাম নিজেই নিজের ভিতর থাকতে পারে; ১টি, ২টি কিংবা n সংখ্যক আকারে। হুম, ঠিক ধরতে পেরেছেন! একটা এ্যারে যখন আরেকটা এ্যারের ভিতর কোন কী বা ইনডেক্স এর ভ্যালু হিসেবে থাকে তখন সেটাকে বলে মাল্টি-ডায়মেনশনাল এ্যারে (Multi-Dimensional Array)। আমরা অনেক এ্যারে শিখেছি এবার লিখার পালা। চলুন তাহলে কিভাবে এ্যারে লিখতে হয় শিখে ফেলি।

এসো এ্যারে লিখিঃ

এ্যারে লিখা ভীষণ সহজ, এর জন্য শুধু মাত্র array() ব্যবহার করলেই হয়। array() হল পিএইচপি ল্যাঙ্গুয়েজ কন্সট্রাক্ট (Language Construct) (আমরা কোন এক ঈদের পর ল্যাঙ্গুয়েজ কন্সট্রাক্ট নিয়ে গল্প স্বল্প করব, সে পর্যন্ত আমার সাথে তাল মিলিয়ে চলুন 😀 )। তবে আমাদের পিএইচপি ভার্সন 5.4 অথবা এর থেকে আপডেট হলে আমরা অলসতা করে [] ব্যবহার করে এ্যারে লিখতে পারি। আমি জন্মের অলস তাই আমাদের সকল উদাহরণে [] ব্যবহার করে লিখব 😀 । চলুন তাহলে একসাথে লিখা শুরু করি-

আমরা খুব সহজেই নীচের মত করে নিউমেরিক এ্যারে লিখতে পারিঃ

$mates = ['Surovi', 'Liton', 'Momin', 'Ishad', 'Farjana', 'Mithila', 'Sithila', 'Shahin', 'Sujon', 'Jahid'];

আপনি পিএইচপি এ্যারাবিয়ান হর্স হয়ে থাকলে অথবা এলোমেলো করে ইনডেক্স লিখতে ইচ্ছে করলে নীচের মত করে লিখতে পারেন। বলে রাখি, সচারচর এভাবে কেউ নিউমেরিক এ্যারে লিখে না।

$mates[1] = 'Liton';
$mates[4] = 'Farjana';
$mates[2] = 'Momin';
$mates[0] = 'Surovi';
$mates[5] = 'Mithila';
$mates[6] = 'Sithila';
$mates[3] = 'Ishad';
$mates[7] = 'Shahin';

// Or this way
$mates = [
    0 => 'Surovi',
    1 => 'Liton',
    2 => 'Momin',
    3 => 'Ishad',
    4 => 'Farjana',
    5 => 'Mithila',
    6 => 'Sithila',
    7 => 'Shahin',
    ];

এখন আমরা লিখব এ্যাসোসিয়েটিভ এ্যারে। হুবহু উদাহরণের মত করে লিখবেন কিন্তু, অন্যথায় জেল জরিমানা হতে পারে (You know, no one messes with Ministers)। এ্যাসোসিয়েটিভ এ্যারের বাদিকে থাকে কী (Key) এবং ডান দিকে থাকে ভ্যালু (Value)। কী (Key) লেখার কিছু নিয়ম কানুন আছে এবং কী (Key) কিছু সুনির্দিষ্ট নিয়ম চলে। পরের পর্বে আমরা সেসব নিয়ম-কানুন নিয়ে খোশ গল্প করব।

$ministers = [
    'prodhanmontri'   => 'Sheikh Hasina',
    'orthomontri'     => 'Abul Mal',
    'krishimontri'    => 'Motia Chowdhury',
    'poribohonmontri' => 'Obaidul Kader',
    ];

এবার আমরা লিখব এমডি বা মাল্টি-ডায়মেনশনাল এ্যারে। যেখানে একজন সত্যিকারের লিভিং, ব্রিদিং এমডি মানে ম্যানেজিং ডিরেক্টর থাকবেন। চলুন দেখে নেই কে সেই এমডি!

$colleagues = [
    [
    'name'     => 'Dulal Khan',
    'role'     => 'MD & Head of Design',
    'vacation' => false,
    ],
    [
    'name'     => 'Mosaddek Hossain',
    'role'     => 'Head of UI/UX',
    'vacation' => false,
    ],
    [
    'name'     => 'Hasin Haydar',
    'role'     => 'MD and Head of Design',
    'vacation' => false,
    ],
    [
    'name'     => 'Nahid Bin Azhar',
    'role'     => 'Laravel Ninja',
    'vacation' => false,
    ],
    [
    'name'     => 'Foysal Zafree',
    'role'     => 'Front End Ninja',
    'vacation' => false,
    ],
    [
    'name'     => 'Arifur Rahaman Naim',
    'role'     => 'WordPress Ninja',
    'vacation' => true,
    ],
    ];

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

পরের পর্বের সুবাস সবার আগে পেতে চাইলে স্বয়ংক্রিয় ভালোবাসায় নিবন্ধন (Email Subscription) করুন 😀

সে পর্যন্ত, হ্যাপি লার্নিং 🙂
ধন্যবাদ

পিএইচপি কলব্যাক ফাংশন পরিচিতি

“সে” কলব্যাক না করলে আপনি হয়ত “অ” হয়ে যান! মানে বলতে চাচ্ছিলাম যে অভিমানী নয়তো অস্থির হয়ে যান 😉 । আর যদি আপনার লাইফে “সে”  না থাকে তবে তো কথাই নেই। আমার মত বিন্দাস 😀 । যাইহোক, আপনি “অ” হোন আর নাই হোন, “সে” কলব্যাক করুক আর নাই করুক আজকে আমরা কলব্যাক নিয়েই আলোচনা করব। চলুন তাহলে শুরু থেকেই শুরু করি…

কলব্যাক ফাংশন হচ্ছে যে ফাংশনকে অন্য ফাংশনের প্যারামিটার হিসেবে নিয়ে সেই অন্য ফাংশনের ভিতর কল বা এক্সিকিউট করা যায়। কলব্যাক ফাংশনের আরেকটি নাম হল Higher Order Function। বাংলায় এটাকে ঊচ্চমার্গীয় ফাংশন হিসেবে ভেবে নিতে পারেন। ঊচ্চমার্গীয় কথাবার্তা মাথার উপর দিয়ে গেলেও ঊচ্চমার্গীয় ফাংশন মাথার নীচ দিয়েই যাবে, নিশ্চিত থাকুন 🙂

পিএইচপির বিল্টইন বহু ফাংশন কলব্যাক ফাংশন আর্গুমেন্ট হিসেবে একসেপ্ট করে। এ্যারের ফাংশন সেটে এরকম বেশকিছু ফাংশন আছে। যেমনঃ array_map(), array_filter(), array_walk(), array_reduce()। চলুন, এ্যারের কিছু ফাংশনের মাধ্যমে কলব্যাকের ব্যবহার এবং বিস্তারিত জেনে নেই।

$nums = [1,2,3,4,5,6,7];
$output = array_reduce($nums, function($carry, $item) {
    return $carry += $item;
});
var_dump($output); // int(28)

উপরের উদাহরণে আমরা কলব্যাক হিসেবে এ্যাননিমাস বা নামহীন ফাংশন ব্যবহার করেছি। এ্যাননিমাস ফাংশন ছাড়াও আমরা অবজেক্টের মেথড,  ক্লাসের স্ট্যাটিক মেথড, ইউজার ডিফাইন্ড ফাংশন অথবা বিল্টইন ফাংশনও ব্যবহার করতে পারি। শুধু মাত্র ল্যাঙ্গুয়েজ কন্সট্রাক্ট ছাড়া, যেমনঃ array(), echo, empty(), eval(), exit(), isset(), list(), print অথবা unset()

ইউজার ডিফাইন্ড ফাংশনঃ

$nums = [1,2,3,4,5,6];
function sum($carry, $item)
{
    return $carry += $item;
}
$result = array_reduce($nums, 'sum');
var_dump($result); // int(21)

বিল্টইন ফাংশনঃ

$fruits = ['apple', 'banana', 'mango', 'jackfruit', 'pineapple'];
$fruitsLen = array_map('strlen', $fruits);
var_dump($fruitsLen);
// array(5) {
//   [0]=>
//   int(5)
//   [1]=>
//   int(6)
//   [2]=>
//   int(5)
//   [3]=>
//   int(9)
//   [4]=>
//   int(9)
// }

অবজেক্ট মেথড ও ক্লাসের স্ট্যাটিক মেথডঃ

class Calculator
{
    public function sum($carry, $item)
    {
        return $carry += $item;
    }
    public static function staticSum($carry, $item)
    {
        return $carry += $item;
    }
}
$calc = new Calculator;
$nums = [1,2,3,4,5];

// Object method call
$result = array_reduce($nums, [$calc, 'sum']);
var_dump($result); // int(15)

// Static method call
$result = array_reduce($nums, ['Calculator', 'staticSum']);
var_dump($result); // int(15)

সাধারণ কলব্যাক ফাংশন পাস করার নিয়মটা সাধারণ কিন্তু অবজেক্ট কিংবা ক্লাসের স্ট্যাটিক মেথডের ক্ষেত্রে নিয়মটা একটু ভিন্ন। অবজেক্ট কিংবা ক্লাসের ক্ষেত্রে আমাদের একটি এ্যারে পাস করতে হবে। এ্যারের জিরো ইনডেস্কে থাকবে ক্লাসের নাম অথবা অবজেক্টের ইন্সট্যান্স এবং ১ নম্বর ইনডেস্কে থাকবে মেথডের নাম।

কাস্টম এ্যারে ম্যাপিং ফাংশনঃ

এবার দেখে নেয়া যাক আমরা কিভাবে আমাদের বানানো ফাংশনে প্যারামিটার হিসেবে কলব্যাক ব্যবহার করতে পারি। আমরা একটি এ্যারে ম্যাপিং ফাংশন বানাবো। পিএইচপির বিল্টইন এ্যারে ম্যাপিং ফাংশন একাধিক এ্যারে নিয়ে কাজ করে। কিন্তু আমরা একটি এ্যারে নিয়েই কাজ করব। “সে” নেই তাই সব সিঙ্গেল সিঙ্গেল হবে 😉

function array_map_single(array $array, callable $callback)
{
    $result = [];
    foreach($array as $key => $val)
    {
        /**
         * There are two ways to execute $callback
         * using call_user_func* or simply $callback()
         * I am not sure which one is best practice,
         * So I'd love to know if you are aware 🙂
         */
        array_push($result, $callback($val, $key));
        // array_push($result, call_user_func($callback, $val, $key));
    }
    return $result;
}

$result = array_map_single(range(1, 5), function($val) {
    return $val += 2;
});
var_dump($result);
// array(5) {
//   [0]=>
//   int(3)
//   [1]=>
//   int(4)
//   [2]=>
//   int(5)
//   [3]=>
//   int(6)
//   [4]=>
//   int(7)
// }

ওয়ার্ডপ্রেসে কলব্যাকঃ

বহুল ব্যবহৃত এ্যাকশন হুক, ফিল্টার হুক থেকে শুরু করে মেটাবক্স, হেল্পমেনু এপিআই সহ প্রায় সব এপিআই ফাংশন কলব্যাক নিয়ে কাজ করে। তাই ওয়ার্ডপ্রেস নিয়ে যারা কাজ করি বা শুরু করছি তাদের কলব্যাক নিয়ে স্পষ্ট ধারনা থাকা দরকার। চলুন, মেটাবক্স রেজিস্টারের মাধ্যমে ওয়ার্ডপ্রেসে কলব্যাকের ব্যবহার দেখে নেই-

function op_register_menu_meta_box() {
    add_meta_box(
        'op-menu-meta-box-id',
        esc_html__( 'Op Menu MetaBox Title', 'text-domain' ),
        'op_render_menu_meta_box',
        'nav-menus',
        'side',
        'core'
        );
}
add_action( 'load-nav-menus.php', 'op_register_menu_meta_box' );

function op_render_menu_meta_box() {
    echo 'metabox output';
}

উদাহরণে op_render_menu_meta_box এবং op_register_menu_meta_box দুটোই কলব্যাক ফাংশন।

৫০০+ ওয়ার্ড পড়ার পর নিশ্চয়ই ঊচ্চমার্গীয় ফাংশনকে আর ঊচ্চমার্গীয় মনে হচ্ছে না, তাই না? বলেই ছিলাম শুরুতে মাথার নীচ দিয়েই যাবে 😀 যদি এরপরও মাথার উপর দিয়ে যায় তাহলে কমেন্ট বক্সে কমেন্ট করে উড়াই দিবেন, আমি ধরে নিবো 🙂

ধন্যবাদ