Massivlar bilan ishlash funksiyalari. To'plam nazariyasi - PHP: Massivlar - qiymat bo'yicha massivlarning Hexlet Php kesishishi

To'plam nazariyasi. Matematiklardan qanchalar qo'rqishini bilaman, lekin aniq nazariya (sodda) juda oddiy va tushunarli. Bundan tashqari, biz doimo uning elementlarini kundalik hayotda ishlatamiz. Dasturlashda esa bu har qadamda sodir bo'ladi.

Ajablanarlisi shundaki, to'plam nazariyasining asosiy tushunchasi bir guruh. To'plam ixtiyoriy xususiyatga ega bo'lgan, bir butun sifatida ko'rib chiqiladigan ob'ektlar to'plamini bildiradi. Eng oddiy misol - raqamlar. Arab raqamlari to'plami 10 ta elementni o'z ichiga oladi va bu final. Cheklanganlik tushunchasi intuitiv bo‘lib, to‘plamda chekli sonli elementlar borligini bildiradi.

Cheksiz to'plamga natural sonlar misol bo'la oladi. O'z navbatida natural sonlar to'plami butun sonlar to'plami bo'lib, ular o'z navbatida ratsional sonlar to'plamidir va hokazo.

"Kichik to'plam" bir to'plamning barcha elementlari boshqa to'plamga kiritilganligini anglatadi superset(kichik to'plamga nisbatan).

To'plamlarni doiralar bilan ifodalash juda qulay. Turli to'plamlarning bir-biriga qanday bog'liqligini tezda baholashingiz mumkin.

Ammo raqamlar kabi matematik ob'ektlar to'plamlarning yagona mumkin bo'lgan ob'ektlari emas. To'plamni avtobus bekatida o'z avtobusini kutayotgan odamlar yoki bitta uydagi, shahar yoki mamlakatdagi kvartiralarning aholisi deb atash mumkin. Biz bir butun sifatida ko'rib chiqmoqchi bo'lgan har qanday ob'ektlar to'plami.

To'plamlar nazariyasida biz uchun asosiy narsa ular ustidagi operatsiyalardir. Bularga quyidagilar kiradi: qo'shish, birlashma, kesishish, farq, Dekart mahsuloti va boshqalar.

Oddiy misol. Facebook’dagi boshqa birovning sahifasiga tashrif buyurganingizda, Facebook sizga umumiy do‘stlaringiz bilan bloklangan joyni ko‘rsatadi. Agar sizning do'stlaringiz va do'stingizning do'stlari ikkita to'plam deb faraz qilsak, u holda umumiy do'stlar asl do'stlar to'plamining kesishishi sifatida olingan to'plamdir.

Dasturlashga o'tsangiz, massiv to'plamga juda o'xshashligini va uni haqiqatan ham shunday deb hisoblash mumkinligini ko'rasiz. Nima uchun bu juda muhim? Muayyan operatsiyalar ortidagi tamoyillarni tushunib, ularni eng tez va samarali tarzda amalga oshirishingiz mumkin. Misol uchun, php da o'rnatilgan kesishish operatsiyasi kerakligini bilib, siz vazifani bajaradigan funktsiyani topishga harakat qilishingiz mumkin. Buning uchun Google-ga so'rovni kiritish kifoya: php to'plami kesishadi(to'siq - to'siq, kesishish - kesishish). Qidiruv natijalaridagi birinchi (hech bo'lmaganda men uchun) havola kerakli array_intersect funksiyasiga olib keladi. Xuddi shu narsa sizni boshqa operatsiyalar bilan kutmoqda. Bu "dasturchilarga matematika kerakmi?" Degan savolga qisman javob.

Aytgancha, barcha tillarda to'plamlar bilan ishlash uchun o'rnatilgan funktsiyalar mavjud emas. Ba'zilarida buning uchun qo'shimcha kutubxonalarni o'rnatish kerak, ba'zilarida, masalan, Ruby'da to'plamlar bilan operatsiyalar arifmetik operatorlar yordamida amalga oshiriladi (to'plamlar birlashmasi: coll1 + coll2).

Alohida ta'kidlash joizki, relyatsion ma'lumotlar bazalari relyatsion algebra g'oyalari asosida qurilgan bo'lib, unda to'plamlar nazariyasi markaziy rol o'ynaydi. Ma'lumotlar bazalari veb-ishlab chiqishning ajralmas qismidir va biz ular bilan keyinroq tanishamiz.

Keling, asosiy operatsiyalarni ko'rib chiqaylik:

Chorraha

To‘plamlarning kesishishi barcha berilgan to‘plamlarda bir vaqtning o‘zida paydo bo‘ladigan elementlarni o‘z ichiga olgan to‘plamdir.

["vasya", "petya"]

Bu funktsiya istalgan miqdordagi massivlarni qabul qiladi. Ya'ni, bitta qo'ng'iroqda istalgan miqdordagi massivlarning kesishishini topishingiz mumkin.

Uyushma

To'plamlar birlashmasi - bu barcha berilgan to'plamlarning elementlarini o'z ichiga olgan to'plam. PHP-da birlashmani o'rnatish bitta qo'ng'iroq bilan amalga oshirilmaydi, lekin uni ikkita funktsiyani ulash orqali simulyatsiya qilish mumkin:

["vasya", "kolya", "petya", "igor", "petya", "sergey", "vasya", "sasha"]; // noyob dublikatlarni olib tashlaydi $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Qo'shish (farq)

Ikki to'plamning farqi birinchi to'plamning ikkinchisiga kiritilmagan elementlarini o'z ichiga olgan to'plamdir. Dasturlashda bu operatsiya ko'pincha deyiladi farq.

["kolya"]

Ko'pchilikka tegishli

In_array funksiyasidan foydalanib, element to‘plamga tegishli ekanligini tekshirishingiz mumkin:

Vazifa
Ikkita massiv bor va siz ularning birlashuvini (barcha elementlar, lekin agar element ikkala massivda bo‘lsa, u bir marta sanaladi), kesishish (har ikkala massivdagi elementlar) yoki farqni (bir massivda bo‘lmagan elementlarni) topmoqchisiz. boshqa).

Yechim
Birlashmani aniqlash uchun:
$union = massiv_unique (massiv_birlashtirish ($a, $b));

Kesishmani hisoblash uchun:
$kesishma = massiv_kesishish($a, $b);

Oddiy farqni topish uchun:
$farq = array_diff($a, $b);

Va nosimmetrik farqni olish uchun (eksklyuziv OR):

Munozara
Bunday hisob-kitoblar uchun zarur bo'lgan ko'plab komponentlar PHP-ga o'rnatilgan, siz ularni tegishli ketma-ketlikda birlashtirishingiz kerak.

Ikki massivdan birlashma olinganda, asl massivlarning barcha qiymatlari bilan bitta ulkan massiv yaratiladi. Ammo array_merge() funktsiyasi ikkita raqamli massivni birlashtirganda takroriy qiymatlarga ruxsat beradi, shuning uchun siz array_unique() funksiyasini chaqirishingiz kerak.
bunday elementlarni filtrlash uchun.

Biroq, bu bo'shliqlarga olib kelishi mumkin, chunki array_unique() funksiyasi massivni siqmaydi. Biroq, bu muammo emas, chunki foreach bayonoti ham, every() funksiyasi ham siyrak to'ldirilgan massivlarni aralashuvsiz boshqaradi.

Kesishmani hisoblash funksiyasi oddiygina array_intersection() deb nomlanadi va hech qanday qo'shimcha harakatlarni talab qilmaydi.

array_diff() funksiyasi $new massivida bo'lmagan $eski massivning barcha noyob elementlarini o'z ichiga olgan massivni qaytaradi. Bu oddiy farq deb ataladi:


$farq = array_diff($eski, $yangi);
Massiv
=> yo'q
=> uchun
)

Olingan $difference massivida "not" va "to" mavjud, chunki array_diff() katta-kichik harflarga sezgir. U "nima bo'lishidan qat'iy nazar" elementni o'z ichiga olmaydi, chunki u $old massivda emas.

Teskari farqni olish yoki boshqacha qilib aytganda, $old massivida etishmayotgan $new massivining noyob elementlarini topish uchun argumentlarni almashtirish kerak:
$old = massiv("To", "bo'l", "yoki", "not", "to", "bo'l");
$new = massiv("To", "bo'l", "yoki", "nima bo'lsa ham");
$teskari_farq = massiv_farq($yangi, $eski);
Massiv
=> nima bo'lishidan qat'iy nazar
)

$reverse_diff massivi faqat "nima bo'lishidan qat'iy nazar" elementini o'z ichiga oladi.

Agar siz array_diff() funksiyasida funksiya yoki boshqa filtrni qo'llashingiz kerak bo'lsa, o'zingizning farq (ayirish) algoritmini kiriting:

// katta-kichik harflarni sezmaydigan ayirish algoritmini qo'llash; farq -i
$seen = massiv();
foreach ($n sifatida $yangi) (
$seen++;
}
foreach ($eski $o) (
$o = strtolower($o);
agar (!$seen[$o]) ( $diff[$o] = $o; )
}

Birinchi foreach bayonoti keyingi qidiruv uchun assotsiativ massivni yaratadi.

Keyin u $eski massividan o'tadi va agar element qidirish paytida topilmasa, u $diff massiviga qo'shiladi.

Bu jarayonni array_diff() va array_map() funksiyalarini birlashtirish orqali tezlashtirish mumkin:

$diff = array_diff(array_map("strtolower", $eski),
array_map("strtolower", $new));

Nosimmetrik farq $a da nima bor, lekin $b da emas, shuningdek, $b da nima bor, lekin $a da emas:

$farq = massiv_birlashtirish (massiv_farq ($a, $b), massiv_farq ($b, $a));

O'rnatilgandan so'ng, algoritm oldinga siljiydi. array_diff() funksiyasi ikki marta chaqiriladi va ikkita farqni aniqlaydi. Keyin ular bitta massivga birlashtiriladi. array_unique() ga qo'ng'iroq qilishning hojati yo'q, chunki bu massivlar umumiy elementlarga ega bo'lmasligi uchun maxsus ishlab chiqilgan.

Bu funksiyalar massivlarni turli usullar bilan boshqarish imkonini beradi. Massivlar oʻzgaruvchilar toʻplamini saqlash, oʻzgartirish va ular bilan ishlash uchun ideal.

Bir va ko'p o'lchovli massivlar qo'llab-quvvatlanadi, ikkalasi ham foydalanuvchi tomonidan yaratilgan va natijada ba'zi funksiyalar tomonidan qaytariladi. Ma'lumotlar bazalari bilan ishlash uchun so'rovlarni bajarish natijasida qaytarilgan ma'lumotlar massivlari bilan ishlashni osonlashtiradigan maxsus funktsiyalar mavjud; Massivlarni natija sifatida qaytaruvchi funksiyalar ham mavjud.

PHP da massivlar qanday yaratilishi va ishlatilishi haqida koʻproq maʼlumot olish uchun ushbu qoʻllanmaning Massivlar boʻlimiga qarang.

O'rnatish

Ushbu xususiyatlardan foydalanish uchun o'rnatish shart emas, chunki ular PHP yadrosining bir qismidir.

Oldindan belgilangan konstantalar

Quyida keltirilgan konstantalar har doim PHP yadrosining bir qismi sifatida mavjud.

CASE_LOWER(butun)

CASE_LOWER funktsiyasi bilan ishlatiladi array_change_key_case() massiv tugmachalarini kichik harflarga aylantirish kerakligini ko'rsatish uchun. Standart funksiya array_change_key_case() Bu doimiy ishlatiladi.

CASE_UPPER(butun)

CASE_UPPER funktsiyasi bilan ishlatiladi array_change_key_case() massiv tugmachalarini katta harflarga aylantirish kerakligini ko'rsatish uchun.

array_change_key_case -- Belgilar kalitlari katta yoki kichik harflarga aylantirilgan massivni qaytarish array_chunk -- Massivni bo'laklarga bo'lish array_combine -- Bir massivni kalit sifatida, ikkinchisini esa massiv_hisoblash qiymatlari mos keladigan qiymatlar sifatida ishlatib, yangi massiv yarating - - barcha qiymatlar sonini hisoblang - CATY_DIFF_UKEY 'yordamida amalga oshiriladigan qo'shimcha indeksni tekshirish uchun qo'shimcha indeks_diff_ukey-ni hisoblash bo'yicha qo'shimcha indekslar kalitni taqqoslash array_diff -- Massiv divergensiyasini hisoblash array_fill -- Massivni ma'lum bir qiymat bilan to'ldirish array_filter -- array_flip qayta qo'ng'iroq yordamida massivga filtr qo'llash -- Massiv qiymatlarini almashtirish array_intersect_assoc -- Massivni qo'shimcha kalitlar qatori bilan hisoblash -- array_intersect_uassoc tugmachalarini taqqoslash orqali massiv kesishishini hisoblang -- Foydalanuvchi tomonidan belgilangan array_intersect_ukey funksiyasi yordamida bajarilgan qo‘shimcha indeks tekshiruvi bilan massiv kesishishini hisoblang -- array_intersect kalitini taqqoslash tugmasidan foydalanib massiv kesishishini hisoblang -- Belgilangan kalit massivni yoki ko‘rsatilgan kalitlar massivini hisoblang -_ array_keys massivida mavjud -- array_map massividagi barcha tugmachalarni tanlang -- Belgilangan massivlarning barcha elementlariga qayta qo‘ng‘iroq qilish funksiyasini qo‘llang array_merge_recursive -- Ikki yoki undan ortiq massivlarni rekursiv birlashtiring array_merge -- Ikki yoki undan ortiq massivlarni birlashtiring --sorr_multtis massivlar yoki ko'p o'lchovli massivlar array_pad -- Massiv hajmini berilgan qiymatga oshirish array_pop -- Massivning oxirgi elementini olish array_product -- Massiv qiymatlari mahsulotini hisoblash array_push -- Oxiriga bir yoki bir nechta element qo'shish array array_rand -- array_reduce dan bir yoki bir nechta tasodifiy qiymatlarni tanlang -- array_reverse qayta qo'ng'iroq qilish funksiyasi yordamida massivni takroriy ravishda bitta qiymatga kamaytiring -- Teskari tartibda elementlarga ega massivni qaytaradi array_search -- Berilgan qiymat uchun massivni qidiradi. va agar array_shift muvaffaqiyatli bajarilsa, tegishli kalitni qaytaradi -- array_slice massivining birinchi elementini oling - - massivning bir qismini tanlang array_splice -- massiv elementlari ketma-ketligini o'chiring va uni boshqa ketma-ketlik bilan almashtiring array_sum -- Massiv qiymatlari yig'indisini hisoblang array_udiff_assoc -- Qiymatlarni solishtirish uchun array_udiff_uassoc qayta qo'ng'iroq funksiyasidan foydalanib, qo'shimcha indeks tekshiruvi bilan massivlardagi farqni hisoblang -- Qiymatlarni solishtirish va indekslarni hisoblash uchun array_udiff qayta qo'ng'iroq funksiyasidan foydalanib, qiymatlarni solishtirish uchun -- Taqqoslash uchun array_uintersect_assoc qayta qo'ng'iroq funksiyasidan foydalangan holda massiv divergensiyasi -- Qiymatlarni solishtirish uchun array_uintersect_uassoc qayta qo'ng'iroq funksiyasidan foydalanib, qo'shimcha indeks tekshiruvi bilan massiv kesishishini hisoblang -- array_uintersect qo'ng'irog'i va taqqoslash uchun orqaga qo'ng'iroq qilish uchun qo'shimcha indeks tekshiruvi bilan massiv kesishishini hisoblang - - Qiymatlarni solishtirish uchun array_unique qayta qo'ng'iroq yordamida massivlarning kesishishini hisoblang -- array_unshift massividan takroriy qiymatlarni olib tashlang -- massiv_values ​​boshiga bir yoki bir nechta element qo'shing -- Barcha qiymatlarni tanlang. massiv array_walk_recursive -- array_walk massivining har bir elementiga maxsus funksiyani rekursiv ravishda qo'llash -- massivning har bir elementiga maxsus funksiyani qo'llash -- massiv arsort yaratish -- massivni teskari tartibda tartiblash, asort tugmachalarini saqlab qolish - - Kalitlarni ixcham saqlagan holda massivni saralash -- O'zgaruvchilar nomlari va ularning qiymatlarini o'z ichiga olgan massiv yaratish