Massiv funksiyalari — count, in_array, sort, array_map, array_filter
Muammodan boshlaylik
Mahsulotlar ro'yxatidan faqat omborda borlarini olish, ularni narx bo'yicha tartiblash, narxlarga 12% QQS qo'shish. foreach bilan yozsa bo'ladi — lekin har safar 5-10 qator. PHP da 70 dan ortiq tayyor massiv funksiyasi bor. Ularni bilish kodingizni qisqa va o'qishli qiladi.
Bu darsda eng ko'p ishlatiladiganlarini ko'ramiz.
Qo'shish va olib tashlash
<?php
$navbat = ["Ali", "Vali"];
array_push($navbat, "Sami"); // oxiriga qo'shish → [Ali, Vali, Sami]
$navbat[] = "Gani"; // xuddi shu, qisqaroq → [Ali, Vali, Sami, Gani]
$oxirgi = array_pop($navbat); // oxiridan olish → "Gani"
$birinchi = array_shift($navbat); // boshidan olish → "Ali"
array_unshift($navbat, "Botir"); // boshiga qo'shish → [Botir, Vali, Sami]
| Funksiya | Qayerdan | Nima qiladi |
|---|---|---|
array_push / [] |
Oxiri | Qo'shadi |
array_pop |
Oxiri | Olib, qaytaradi |
array_unshift |
Boshi | Qo'shadi |
array_shift |
Boshi | Olib, qaytaradi |
Qidirish
<?php
$ruxsatlar = ["read", "write", "delete"];
var_dump(in_array("write", $ruxsatlar)); // bool(true)
var_dump(in_array("admin", $ruxsatlar)); // bool(false)
echo array_search("delete", $ruxsatlar); // 2 — qaysi indeksda
$user = ["ism" => "Ali", "yosh" => 30];
var_dump(array_key_exists("yosh", $user)); // bool(true)
in_array ham == bilan solishtiradi. Qat'iy tekshirish uchun uchinchi parametr:
<?php
var_dump(in_array("1", [1, 2, 3])); // true
var_dump(in_array("1", [1, 2, 3], true)); // false — qat'iy
Kalitlar va qiymatlar
<?php
$narxlar = ["olma" => 12000, "nok" => 15000, "uzum" => 25000];
print_r(array_keys($narxlar)); // [olma, nok, uzum]
print_r(array_values($narxlar)); // [12000, 15000, 25000]
echo array_sum($narxlar); // 52000
echo max($narxlar); // 25000
echo min($narxlar); // 12000
array_values() yana bir muhim ish qiladi — indekslarni qayta raqamlaydi (0, 1, 2...). unset() dan keyin teshik qolgan massivlarda foydali.
Tartiblash
<?php
$sonlar = [42, 7, 19, 3];
sort($sonlar); // o'sish bo'yicha → [3, 7, 19, 42]
rsort($sonlar); // kamayish bo'yicha → [42, 19, 7, 3]
[!WARNING]
sort()massivni joyida o'zgartiradi va natija qaytarmaydi (trueqaytaradi).$tartiblangan = sort($sonlar);— bu xato:$tartiblangangatruetushadi.
Assotsiativ massivlar uchun — kalitlarni saqlab qoladigan variantlar:
<?php
$narxlar = ["uzum" => 25000, "olma" => 12000, "nok" => 15000];
asort($narxlar); // qiymat bo'yicha, kalitlar saqlanadi
// [olma => 12000, nok => 15000, uzum => 25000]
ksort($narxlar); // kalit bo'yicha (alifbo)
// [nok => 15000, olma => 12000, uzum => 25000]
arsort, krsort — teskari tartibda.
O'zingiz qoida berish: usort
Ko'p o'lchovli massivni biror maydon bo'yicha tartiblash:
<?php
$mahsulotlar = [
["nom" => "Telefon", "narx" => 3200000],
["nom" => "Quloqchin", "narx" => 249000],
["nom" => "Noutbuk", "narx" => 8900000],
];
usort($mahsulotlar, fn($a, $b) => $a["narx"] <=> $b["narx"]);
// Quloqchin, Telefon, Noutbuk — arzonidan qimmatiga
Mana <=> (spaceship) operatori qayerda kerak bo'ladi. fn(...) => — qisqa funksiya, 16-darsda batafsil. Hozircha: "ikki elementni qanday solishtirishni aytuvchi kichik funksiya".
array_map — har bir elementni o'zgartirish
<?php
$narxlar = [100000, 250000, 40000];
$qqsBilan = array_map(fn($narx) => $narx * 1.12, $narxlar);
// [112000, 280000, 44800]
Asl massiv o'zgarmaydi — yangi massiv qaytadi.
Real misol — ismlar ro'yxatini tozalash:
<?php
$ismlar = [" ali ", "VALI", "sami "];
$toza = array_map(fn($ism) => ucfirst(strtolower(trim($ism))), $ismlar);
// ["Ali", "Vali", "Sami"]
array_filter — keraklilarini ajratib olish
<?php
$mahsulotlar = [
["nom" => "Telefon", "soni" => 5],
["nom" => "Noutbuk", "soni" => 0],
["nom" => "Quloqchin", "soni" => 12],
];
$borlari = array_filter($mahsulotlar, fn($m) => $m["soni"] > 0);
Funksiya true qaytargan elementlar qoladi.
Tuzoq: array_filter kalitlarni saqlaydi. Natija [0 => Telefon, 2 => Quloqchin] — 1 yo'q. Ketma-ket indeks kerak bo'lsa:
<?php
$borlari = array_values(array_filter($mahsulotlar, fn($m) => $m["soni"] > 0));
Funksiyasiz chaqirilsa — "false" qiymatlarni olib tashlaydi:
<?php
$teglar = ["php", "", "mysql", null, "laravel"];
print_r(array_filter($teglar)); // bo'sh va null olib tashlandi
array_column — bitta ustunni olish
Bazadan kelgan qatorlardan faqat bitta maydonni yig'ish:
<?php
$foydalanuvchilar = [
["id" => 1, "email" => "a@mail.uz"],
["id" => 2, "email" => "b@mail.uz"],
["id" => 3, "email" => "c@mail.uz"],
];
$emaillar = array_column($foydalanuvchilar, "email");
// ["a@mail.uz", "b@mail.uz", "c@mail.uz"]
$idBoyicha = array_column($foydalanuvchilar, "email", "id");
// [1 => "a@mail.uz", 2 => "b@mail.uz", 3 => "c@mail.uz"]
Birlashtirish va kesish
<?php
$standart = ["til" => "uz", "mavzu" => "yorug'"];
$foydalanuvchi = ["mavzu" => "qorong'i"];
$sozlama = array_merge($standart, $foydalanuvchi);
// ["til" => "uz", "mavzu" => "qorong'i"] — keyingisi ustun
$birinchi3 = array_slice([10, 20, 30, 40, 50], 0, 3); // [10, 20, 30]
$noyob = array_unique(["php", "js", "php", "go"]); // ["php", "js", "go"]
$teskari = array_reverse([1, 2, 3]); // [3, 2, 1]
array_merge — standart sozlamalarni foydalanuvchi tanlovi bilan birlashtirishda juda qulay.
Nima uchun shunday?
Nima uchun sort() joyida o'zgartiradi, array_map() esa yangi massiv qaytaradi?
Tarixiy sabab: sort kabi eski funksiyalar C uslubida yozilgan — u yerda xotirani tejash uchun joyida o'zgartirish odat edi. array_map, array_filter esa funksional dasturlash g'oyalaridan keyinroq kelgan, u yerda asl ma'lumotni o'zgartirmaslik — asosiy tamoyil. Qoida: array_ bilan boshlanuvchi ko'p funksiyalar yangi massiv qaytaradi; sort oilasi va array_push/pop/shift/unshift — joyida o'zgartiradi.
Tez-tez uchraydigan xatolar
sort() natijasini o'zgaruvchiga saqlash — yuqorida ko'rdik.
array_map va array_filter da parametrlar tartibi:
<?php
array_map($funksiya, $massiv); // avval funksiya
array_filter($massiv, $funksiya); // avval massiv
Ha, teskari. Bu PHP ning mashhur nomuvofiqligi — yodlashdan boshqa chora yo'q (yoki muharrir maslahatiga qarang).
array_filter dan keyin [0] ga murojaat:
<?php
$natija = array_filter([0, 5, 10]); // [1 => 5, 2 => 10]
echo $natija[0]; // Warning: Undefined array key 0
Xulosa
Eslab qoling:
count,in_array,array_key_exists,array_search— tekshirish va qidirishsort,asort,ksort,usort— tartiblash, joyida o'zgartiradiarray_map— har birini o'zgartirish,array_filter— saralab olisharray_filterkalitlarni saqlaydi — kerak bo'lsaarray_values()array_column,array_merge,array_unique,array_slice— kundalik yordamchilar
Keyingi dars
14-dars: Funksiyalar — e'lon qilish, parametr, return, default qiymat