Massiv funksiyalari — count, in_array, sort, array_map, array_filter

~20 daq · PHP · Massivlar

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 (true qaytaradi). $tartiblangan = sort($sonlar); — bu xato: $tartiblangan ga true tushadi.

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 qidirish
  • sort, asort, ksort, usort — tartiblash, joyida o'zgartiradi
  • array_map — har birini o'zgartirish, array_filter — saralab olish
  • array_filter kalitlarni saqlaydi — kerak bo'lsa array_values()
  • array_column, array_merge, array_unique, array_slice — kundalik yordamchilar

Keyingi dars

14-dars: Funksiyalar — e'lon qilish, parametr, return, default qiymat