Massivlar — indeksli, assotsiativ, ko'p o'lchovli

~20 daq · PHP · Massivlar

Muammodan boshlaylik

Do'konda 50 ta mahsulot bor. Har biri uchun o'zgaruvchi yaratamizmi?

<?php

$mahsulot1 = "Telefon";
$mahsulot2 = "Noutbuk";
$mahsulot3 = "Quloqchin";
// ... $mahsulot50

Ularni sikl bilan chiqarib bo'lmaydi, sonini bilib bo'lmaydi, yangisini qo'shish uchun kodni o'zgartirish kerak. Bir turdagi ko'p ma'lumotni bitta joyda saqlash uchun — massiv bor.

PHP da massiv — eng ko'p ishlatiladigan tuzilma. Bazadan kelgan qatorlar, forma ma'lumotlari, JSON, konfiguratsiya — hammasi massiv.


Indeksli massiv

Elementlar tartib bilan, raqam (indeks) orqali saqlanadi:

<?php

$mahsulotlar = ["Telefon", "Noutbuk", "Quloqchin"];

echo $mahsulotlar[0];   // Telefon
echo $mahsulotlar[1];   // Noutbuk
echo $mahsulotlar[2];   // Quloqchin

[!INFO] Indeks 0 dan boshlanadi. Birinchi element — [0], oxirgisi — [soni - 1].

Hayotiy o'xshatma: poyezd vagonlari. Har bir vagonda yuk bor, vagonlar raqamlangan. Faqat bu poyezdda birinchi vagon raqami — 0.

Element qo'shish va o'zgartirish

<?php

$mahsulotlar = ["Telefon", "Noutbuk"];

$mahsulotlar[] = "Planshet";      // oxiriga qo'shish
$mahsulotlar[0] = "Smartfon";     // o'zgartirish

print_r($mahsulotlar);
Array
(
    [0] => Smartfon
    [1] => Noutbuk
    [2] => Planshet
)

print_r() — massivni o'qish uchun qulay ko'rinishda chiqaradi. var_dump() esa turlarini ham ko'rsatadi.

Elementlar soni

<?php

echo count($mahsulotlar);   // 3

Assotsiativ massiv

Indeks o'rniga nomli kalit ishlatiladi:

<?php

$foydalanuvchi = [
    "ism"    => "Shahzod",
    "email"  => "shahzod@mail.uz",
    "yosh"   => 27,
    "faol"   => true,
];

echo $foydalanuvchi["ism"];     // Shahzod
echo $foydalanuvchi["email"];   // shahzod@mail.uz

=> — "kalit qiymatga ishora qiladi". Indeksli massivda [1] nima ekanini eslab qolish kerak; assotsiativda ["email"] — o'zi tushunarli.

Hayotiy o'xshatma: anketa. Har bir qatorda maydon nomi va qiymati bor.

<?php

$foydalanuvchi["telefon"] = "+998 90 123 45 67";   // yangi kalit qo'shish
$foydalanuvchi["yosh"] = 28;                       // mavjudini o'zgartirish
unset($foydalanuvchi["faol"]);                     // o'chirish

Kalit mavjudligini tekshirish

<?php

echo $foydalanuvchi["manzil"];
// Warning: Undefined array key "manzil"

// ✅ Xavfsiz usullar:
echo $foydalanuvchi["manzil"] ?? "Ko'rsatilmagan";

if (isset($foydalanuvchi["manzil"])) { ... }               // mavjud va null emas
if (array_key_exists("manzil", $foydalanuvchi)) { ... }    // mavjud (null bo'lsa ham)

Nima uchun shunday?

Boshqa tillarda "array" (ro'yxat) va "dictionary/map/object" (lug'at) — ikki xil narsa. PHP da nima uchun bitta?

PHP ichida massiv aslida tartiblangan lug'at (ordered hash map). Indeksli massiv — bu shunchaki kalitlari 0, 1, 2... bo'lgan lug'at. Shuning uchun ularni aralashtirish ham mumkin:

<?php

$aralash = ["olma", "rang" => "qizil", "nok"];
print_r($aralash);
// [0] => olma, [rang] => qizil, [1] => nok

Bu moslashuvchanlik PHP ni vebda qulay qilgan — bazadan kelgan qator ham, forma ham, JSON ham bitta tuzilmaga tushadi. Lekin amalda aralash massivlardan qoching — chalkashlik keltiradi.


Ko'p o'lchovli massivlar

Massiv ichida massiv. Eng ko'p uchraydigan holat — ro'yxatdagi yozuvlar (bazadan kelgan jadval kabi):

<?php

$mahsulotlar = [
    ["id" => 1, "nom" => "Telefon",   "narx" => 3200000],
    ["id" => 2, "nom" => "Noutbuk",   "narx" => 8900000],
    ["id" => 3, "nom" => "Quloqchin", "narx" => 249000],
];

echo $mahsulotlar[1]["nom"];    // Noutbuk
echo $mahsulotlar[2]["narx"];   // 249000

Avval qaysi qator ([1]), keyin qaysi ustun (["nom"]).

Lug'at ichida lug'at:

<?php

$sozlamalar = [
    "db" => [
        "host" => "localhost",
        "nom"  => "dokon",
    ],
    "sayt" => [
        "nom" => "Mening do'konim",
        "til" => "uz",
    ],
];

echo $sozlamalar["db"]["host"];   // localhost

Massivni chiqarish

echo massivni chiqara olmaydi:

<?php

$ranglar = ["qizil", "yashil"];
echo $ranglar;
// Warning: Array to string conversion → "Array" chiqadi

Variantlar:

<?php

print_r($ranglar);              // tuzilmani ko'rish (debug)
var_dump($ranglar);             // turlar bilan (debug)
echo implode(", ", $ranglar);   // qizil, yashil — foydalanuvchiga ko'rsatish

Brauzerda print_r ni chiroyli ko'rish uchun <pre> ga o'rang:

<?php

echo "<pre>";
print_r($mahsulotlar);
echo "</pre>";

Destructuring — massivdan o'zgaruvchilarga

<?php

$koordinata = [41.31, 69.28];
[$kenglik, $uzunlik] = $koordinata;

echo $kenglik;   // 41.31

$user = ["ism" => "Ali", "yosh" => 30];
["ism" => $ism, "yosh" => $yosh] = $user;

echo $ism;   // Ali

Ikki o'zgaruvchini almashtirish:

<?php

$a = 1;
$b = 2;
[$a, $b] = [$b, $a];   // endi $a = 2, $b = 1

Spread operatori ...

<?php

$mevalar = ["olma", "nok"];
$sabzavotlar = ["sabzi", "piyoz"];

$hammasi = [...$mevalar, ...$sabzavotlar];
// ["olma", "nok", "sabzi", "piyoz"]

Tez-tez uchraydigan xatolar

Indeks 1 dan boshlanadi deb o'ylash:

<?php

$kunlar = ["Dushanba", "Seshanba", "Chorshanba"];
echo $kunlar[3];
// Warning: Undefined array key 3

Kalitni qo'shtirnoqsiz yozish:

<?php

echo $user[ism];
// Error: Undefined constant "ism"

To'g'risi: $user["ism"] yoki $user['ism'].

String ichida massiv elementi:

<?php

echo "Ism: $user['ism']";     // ❌ Parse error
echo "Ism: {$user['ism']}";   // ✅

Xulosa

Eslab qoling:

  • Indeksli: ["a", "b"], indeks 0 dan boshlanadi
  • Assotsiativ: ["kalit" => "qiymat"]
  • $arr[] = x — oxiriga qo'shish, unset($arr['k']) — o'chirish
  • count() — soni; ?? va isset() — xavfsiz o'qish
  • Ko'p o'lchovli: $arr[qator][ustun]
  • print_r / var_dump — debug uchun, implode — ko'rsatish uchun

Keyingi dars

12-dars: foreach — massiv ustida yurish, kalit => qiymat