Би массив дахь утгыг хайхын тулд array_search() функцийг нэлээд удаан ашиглаж байна, учир нь энэ нь давталтын массиваар хайлт хийхээс хамаагүй хурдан ажилладгийг би олон удаа сонсож, уншсан боловч тэгээгүй. хэр хурдан болохыг мэднэ. Эцэст нь өөрөө шалгаж, тоолохоор боллоо.

Би энэ функцийг ашиглан массиваар хайлт хийх хурдыг foreach болон while давталт дахь массиваар дамжуулан ердийн хайлттай харьцуулсан. Массивын 10-100 элемент дээр ялгаа нь анзаарагдахгүй бөгөөд цаг хугацаа маш богино тул үүнийг үл тоомсорлож болно. Гэхдээ том массивуудын хувьд ялгаа нь нэлээд ач холбогдолтой болсон. Массивын хэмжээ дарааллаар нэмэгдэхийн хэрээр хайлтын хугацаа ч мөн мэдэгдэхүйц нэмэгдсэн. Зуун мянган элементтэй үед foreach-ийн хурд 0.013 секунд, харин 0.017 хүртэл буурч, array_search() мөн удааширсан ч 0.004 секундын дараалалтай хэвээр байна. Том массивтай ажилладаг том скриптийн хувьд давталт дахь хайлтыг array_search() ашиглан хайлтаар солих нь "бүүргийн оновчлол" огт болохгүй.

Үүнтэй холбогдуулан саяхан ажлынхаа нэг хамт олонтой програмист хүн эдгээр бүх хэлний функцийг мэддэг байх шаардлагатай юу, эсвэл "програмистын сэтгэлгээ" болон ерөнхий мэдлэг хангалттай эсэх талаар ярилцаж байсныг санаж байна. Яг энэ сэтгэлгээний талаар ярилцахгүйгээр та функцуудыг, магадгүй бүх синтаксийг нарийвчлан биш, ядаж ямар функцүүд байдаг, ерөнхийд нь юу хийж чадах талаар мэдэх хэрэгтэй гэж би бодож байна.

UPD: Танд бас програмистын сэтгэлгээ хэрэгтэй! Мөн ой санамждаа болгоомжтой хандах нь гэмтэхгүй (завсарлага, хүрээнээс санаа авсан :)

Хакерын доор цагийг тооцоолоход ашигласан скрипт код байна:

$масс=100000; // бидний хайх массив дахь утгуудын тоо
$хайлт=50000; // бид энэ утгыг массиваас хайх болно
$first_result=array(); // эхний сонголтын дундаж утгыг тооцоолох үр дүнгийн массив
$second_result=array(); // хоёр дахь хувилбарын дундаж утгыг тооцоолох үр дүнгийн массив
$third_result=array(); // гурав дахь хувилбарын дундаж утгыг тооцоолох үр дүнгийн массив

// массив үүсгэж дүүргэнэ
$test_array = муж(0, $масс-1); // SelenIT-д баярлалаа))

/*
$test_array=array();
төлөө ($i=0; $i<$mass; $i++)
{
$test_array=$i;
}
*/

// дундаж утгыг тооцоолох гогцоо
төлөө ($d=0; $d<30; $d++) {

//**************** array_search ашиглан хайх ********************

// Цаг тоолж эхэлнэ
$time_start = microtime(1);
// хайх
$ түлхүүр = массив_хайлт ($ хайлт, $ тестийн_массив, үнэн);
// олдвол
if ($key!==FALSE) // шаардлагатай!== биш!=, учир нь эхний элементийн тоо 0 байна.
{
echo $test_array[$key];
}
$time_end = microtime(1);
// эцсийн хугацааг тоолох

// утгын массив руу бичнэ
$first_result= $time_end - $time_start;

//**************** Foreach давталт бүхий массиваар хайх ********************

// Цаг тоолж эхэлнэ
$time_start = microtime(1);
// хайлт өөрөө
foreach ($test_array гэж $ta)
{
хэрэв ($ta==$хайх)
{
echo $ta;
завсарлага;
}
}
$time_end = microtime(1);
// эцсийн хугацааг тоолох

// утгын массив руу бичнэ
$second_result= $ time_end - $ time_start;

//******************** while цикл бүхий массиваар хайх ********************

// Цаг тоолж эхэлнэ
$time_start = microtime(1);

// массивын уртыг тодорхойлно
$count=count($test_array);
$j=0;
// хайлт өөрөө
байхад ($j<$count)
{
хэрэв ($test_array[$j]==$search) // олдвол
{
echo $test_array[$j];
завсарлага;
}
$j++;
}
$time_end = microtime(1);
// эцсийн хугацааг тоолох

// утгын массив руу бичнэ
$third_result= $ time_end - $ time_start;
}

$srednee1=массив_нийлбэр($эхний_үр дүн)/тоолох($эхний_үр дүн);
$srednee2=массив_нийлбэр ($хоёр дахь_үр дүн)/тоолох($хоёр дахь_үр дүн);
$srednee3=массив_нийлбэр ($гурав дахь_үр дүн)/тоолох($гурав дахь_үр дүн);

Printf("эхний код дунджаар дууссан: %.7f секунд", $srednee1);
printf("хоёр дахь код дунджаар: %.7f секундэд дууссан", $srednee2);
printf("гурав дахь код дунджаар: %.7f секундэд дууссан", $srednee3);

// үр дүн:
// эхний код дунджаар дууссан: 0.0000295 секунд
// хоёр дахь код дунджаар дууссан: 0.0153386 секунд
// Гурав дахь кодыг дунджаар дуусгасан: 0.0226001 секунд

Массивтай ажиллах үндсэн үйлдлүүдийн нэг бол тодорхой утгыг хайх явдал юм. PHP array_search() функц нь үүнд зориулагдсан болно. Энэ нь нэг хэмжээст болон ассоциатив цуглуулгыг хоёуланг нь боловсруулах чадвартай бөгөөд хэрэв массиваас олдвол хайсан утгын түлхүүрийг буцаана.

Синтакс

PHP дахь array_search() функцийн албан ёсны тайлбар дараах байдалтай байна.

Холимог array_search (холимог утга, массив $ цуглуулга [, bool strict])

Оролтын параметрүүд:

  • $ цуглуулга - хайлт хийх массив;
  • үнэ цэнэ - ямар ч төрлийн хүссэн утга;
  • strict нь төрлийг мэддэг хатуу харьцуулах механизмыг тохируулдаг нэмэлт логикийн туг юм.

Үйл ажиллагааны механизм

PHP функц array_search() нь утгыг цуглуулгын массив дахь бүх утгуудтай нэг нэгээр нь харьцуулдаг. Анхдагч байдлаар, харьцуулалтыг операндуудын төрлөөс үл хамааран гүйцэтгэдэг. Энэ тохиргоог хатуу тугийг ҮНЭН болгож өөрчлөх боломжтой. Мөрний харьцуулалт нь жижиг жижиг жижиг том үсгийг мэдэрдэг.

Хэрэв тохирох зүйл олдвол олсон элементэд тохирох түлхүүр буцаж ирэх ба функц ажиллахаа болино. Тиймээс массив дахь хүссэн утгын олон тохиолдлыг илрүүлэхэд ашиглах боломжгүй.

Хэрэв тохирох зүйл олдохгүй бол функц нь FALSE логик утгыг буцаана.

Та хатуу тэгш байдлын оператор (===) ашиглан буцаасан үр дүнг шалгах хэрэгтэй. Функц нь 0 эсвэл хоосон мөр гэх мэт FALSE руу шилжүүлсэн утгыг буцааж болох тул энэ нь чухал юм.

Хэрэглээний жишээ

Жишээ 1. Олон хэмжээст массивыг PHP array_search() функцэд дамжуулах үед ажлын үр дүн нь хайсан элементийн түлхүүр болно.

"өвөл", "2 улирал" => "хавар", "3 улирал" => "зун", "4 улирал" => "намар"); $үр дүн1 = array_search("өвөл", $массив); $result2 = array_search("зун", $массив); $үр дүн3 = array_search("4-р сар", $массив); ?>

Энэ жишээнд $result1-г "season1", $result2-г "season3" болгож, $result3-г FALSE логикийн утгыг тохируулах болно, учир нь "april" мөр эх массив дээр харагдахгүй байна.

Жишээ 2. PHP array_search() функц нь мөн нэг хэмжээст массивыг боловсруулах боломжтой бөгөөд түүний түлхүүрүүдийг дараах тоон индекс болгон авч үзнэ.

$ массив дахь "анчин" элементийн индексийн дагуу $ үр дүнгийн хувьсагчийг 1 болгож тохируулна.

Жишээ 3. Үр дүнд дүн шинжилгээ хийх үед гарч болзошгүй алдаа.

"Вашингтон", 1 => "Адамс", 2 => "Жефферсон", 3 => "Мэдисон", 4 => "Монро"); $үр дүн = array_search("Вашингтон", $ ерөнхийлөгчид); if (!$result) ( echo "Г.Вашингтон АНУ-ын анхны ерөнхийлөгч байгаагүй"; ) ?>

Тиймээс, үр дүнг хатуу тэгш эрхтэйгээр шалгахгүйгээр та Жорж Вашингтоныг АНУ-ын анхны ерөнхийлөгч биш байсан гэсэн гэнэтийн мессежийг авах боломжтой.

Жишээ 4: Зөвхөн эхний олдсон тохирох түлхүүрийг буцаана.

Хэдийгээр таны хайж буй утга массив дотор гурван удаа гарч байгаа ч функц нь зөвхөн эхний олдсон үр дүнг буцаана - 0. Олон тооны тохирохыг олохын тулд PHP array_keys() функцийг ашиглахыг зөвлөж байна.

Массив дахь утгыг хайх нь өгөгдөлтэй ажилладаг бараг бүх PHP програм, скриптэд шаардлагатай байдаг бөгөөд үүнд зориулсан олон арга, тусгай функцууд байдаг. Хайлтын даалгавар, төрлөөс хамааран тэдгээрийн онцлог, гүйцэтгэлийн хурд, ашиглахад хялбар байдлыг харгалзан тодорхой хэрэгслийг ашиглах хэрэгтэй. Дараа нь бид массив дахь элементүүдийг хайх PHP функцууд, боломжит бүтэц, аргуудтай танилцаж, аль арга нь хамгийн хурдан болохыг олж мэдэх болно.

Массив дотор хайх функцууд:
массив_хайлт- массив дахь утгыг хайхад ашигладаг. Амжилттай бол хайсан утгын түлхүүрийг буцаана. PHP 4.2.0-ээс өмнө array_search() амжилтгүй болсон үед FALSE биш харин NULL-г буцаадаг байсан.

Mixed array_search функцын синтакс (холимог зүү, массив өвслөг [, bool strict]).

foreach (массив_илэрхийлэл нь $ утга)
мэдэгдэл
foreach (массив_илэрхийлэл нь $ түлхүүр => $ үнэ цэнэ)
мэдэгдэл

Массивын элементийг хайж олохын тулд foreach бүтэцтэй функцийг ашиглах жишээ, амжилттай бол ҮНЭН гэж буцаана.

Барилгын синтакс
байхад (илэрхийлэл)
мэдэгдэл

Амжилтанд хүрсэн массив элементийн түлхүүрийг буцаана

Хэмжилтийн хүснэгтээс функцийг харж болно массив_хайлт, жижиг болон том массиваар хайхад хамгийн сайн үр дүнг харуулдаг. Үүний зэрэгцээ гогцоо ашиглан хайх хугацаа нь массивын хэмжээнээс хамааран ихээхэн нэмэгддэг.

олон хэмжээстээс (18)

Би доорх жишээнүүдийн аль нэгийг array_search функцийг тайлбарлахын тулд өөрчилсөн. SearchItemsByKey функц нь олон хэмжээст массиваас (N түвшин) бүх утгыг $ түлхүүрээр буцаана. Магадгүй энэ нь хэн нэгэнд ашигтай байх болов уу. Жишээ:

$arr = массив("XXX"=>массив("YYY"=> массив("AAA"=> массив("keyN" =>"утга1")), "ZZZ"=> массив("BBB"=> массив ("keyN" => "утга2")) //.....)); $үр дүн = searchItemsByKey($arr,"keyN"); хэвлэх"

"; print_r($ үр дүн); хэвлэх " 
"; // OUTPUT массив ( => утга1 => утга2)

Функцийн код:

Функц хайлтынItemsByKey($массив, $түлхүүр) ( $үр дүн = массив(); if (is_array($ массив)) ( if (isset($array[$key]) && key($array)==$key) $results = $массив[$түлхүүр] ($массив нь $ дэд_массив) $үр дүн = массив_мэргэжлэх($үр дүн, searchItemsByKey($ дэд_массив, $түлхүүр));

Надад uid хайж, массивын түлхүүрийг авахыг хүссэн массив байна.

Жишээ

Бидэнд дараах хоёр хэмжээст массив байна гэж бодъё.

$userdb = массив(массив("uid" => "100", "нэр" => "Сандра Шуш", "pic_square" => "urlof100"), массив("uid" => "5465", "нэр" => "Stefanie Mcmohn", "pic_square" => "urlof100"), array("uid" => "40489", "нэр" => "Майкл", "pic_square" => "urlof40489"));

search_by_uid(100) (эхний хэрэглэгчийн uid) руу залгахад 0 гарч ирнэ.

search_by_uid(40489) функцийн дуудлага 2-ыг буцаана.

Би гогцоо үүсгэх гэж оролдсон ч илүү хурдан гүйцэтгэх код хэрэгтэй байна.

Жакубын маш сайн хариулт дээр тулгуурлан, түлхүүрийг (зөвхөн uid биш) зааж өгөх боломжийг олгодог илүү ерөнхий хайлтыг энд оруулав.

Функцийн хайлтын массив ($ үнэ цэнэ, $ түлхүүр, $ массив) ( foreach ($ массив нь $ k => $ val) (хэрэв ($val[$key] == $утга) ($k буцаана; ) ) null буцаана )

Хэрэглээ: $results = searcharray("хайлтын утга", хайлтын түлхүүр, $array);

Функц searchForId($id, $array) ( foreach ($түлхүүр => $val) (хэрэв ($val["uid"] === $id) ($key буцаана; ) ) null буцаана; )

Энэ нь ажиллах болно. Та үүнийг ингэж нэрлэх хэрэгтэй:

$id = searchForId("100", $userdb);

Хэрэв та === ашигладаг бол харьцуулж буй операторын төрлүүд яг адилхан байх ёстой гэдгийг мэдэх нь чухал бөгөөд энэ жишээн дээр та string хайх эсвэл ===-ийн оронд == ашиглах хэрэгтэй.

Хариулт дээр үндэслэн ангор. PHP-ийн дараагийн хувилбаруудад (>= 5.5.0) та нэг давхаргыг ашиглаж болно.

$key = array_search("100", array_column($userdb, "uid"));

Хэдийгээр энэ бол хуучин асуулт бөгөөд хүлээн зөвшөөрөгдсөн хариулт байгаа ч би хүлээн зөвшөөрөгдсөн хариултыг өөрчлөхийг санал болгоё гэж бодлоо. Тиймээс юуны түрүүнд энд хүлээн зөвшөөрөгдсөн хариулт зөв гэдгийг би хүлээн зөвшөөрч байна.

Функц searchArrayKeyVal($sKey, $id, $array) ( foreach ($түлхүүрээр $массив => $val) (хэрэв ($val[$sKey] == $id) ( буцах $key; ) ) худал буцаана; )

Үүний оронд урьдчилан тохируулсан "uid"-г функц доторх параметрээр солих тул одоо доорх кодыг дуудах нь олон төрлийн массивын хувьд нэг функцийг ашиглах боломжтой гэсэн үг юм. Бага зэрэг өөрчлөлт, гэхдээ энэ нь арай өөр юм.

// Хэрэглэгчдийн массив өгөгдөл $userdb = массив ("uid" => "100","нэр" => "Сандра Шуш","url" => "urlof100"), массив ("uid" => " 5465","нэр" => "Стефани Макмон","url" => "urlof100"), массив ("uid" => "40489","нэр" => "Майкл","url" => "urlof40489 "),); // Массивын түлхүүрийг авах $arrayKey = searchArrayKeyVal("uid", "100", $userdb); if ($arrayKey!==false) ( echo "Хайлтын үр дүн: ", $userdb[$arrayKey]["name"]; ) else ( echo "Хайлтын үр дүн олдохгүй байна"; )

If(! function_exists("arraySearchMulti"))( function arraySearchMulti($search,$key,$array,$returnKey=false) ( foreach ($array as $k => $val) ( if (isset($val[$)) key])) ( if ((string)$val[$key] == (string)$search) ( буцах ($returnKey ? $k: $val); ) )else( буцах (is_array($val) ? arraySearchMulti ($хайх,$түлхүүр,$val,$returnKey) : null);

та энэ функцийг ашиглаж болно; https://github.com/serhatozles/ArrayAdvancedSearch

="2""; $Массив = массив("a" => массив("d" => "2"), массив("a" => "Жишээ ертөнц","b" => "2"), массив("c" => "3"), массив("d" => "4"), $Үр дүн = ArraySearch($Array,$query,1);

"; print_r($Result); echo "
"; // Гаралт: // Массив // (// => Массив // (// [a] => Жишээ ертөнц // [b] => 2 //) // //)

Хэрэв асуулт, i.e.

$a = [ [ "_id" => "5a96933414d48831a41901f2", "хямдралын_ дүн" => 3.29, "хямдралын_id" => "5a92656a14d488570c2c44a2", ], [ "_id"189c ", "тоолох_тоо" => 4.53, " discount_id" => "5a9265b914d488548513b122", ], [ "_id" => "5a98083614d488191304b6c3", "хямдралын_хэмжээ" => 15.24, "хямдралын_id" =>845]a85] [ "_id" > "5a982a4914d48824721eafe3", "хямдралын_дүгээр " => 45.74, "discount_id" => "5a928ce414d488609e73b443", ], [ "_id" => "5a982a4914d48824721eafe55", "хямдралын_ дүн" => 10.26 "id5189" 73b4 43", ], ];

Функц searchForId($id, $array) ( $did=0; $dia=0; foreach ($массив $түлхүүр => $val) ( хэрэв ($val["хямдралын_id"] === $id) ( $ dia +=$val["scount_amount"]; $did++ ) if($dia != "") ( echo $dia; var_dump($did); ) return null); print_r(searchForId("5a928ce414d488609e73b443",$a));

Үүнийг бас үзээрэй

Функц хайлтын_массив($srchvalue, $array) ( if (is_array($array) && count($array) > 0) ( $foundkey = array_search($srchvalue, $array); if ($foundkey === FALSE) ( foreach ($ массивыг $ түлхүүрээр => $ үнэ цэнэ) (хэрэв (хэрэв (is_array($ үнэ цэнэ) && тоо ($ үнэ цэнэ) > 0) ( $ олдсон түлхүүр = массив доторх хайлт ($ srchvalue, $ үнэ цэнэ); хэрэв ($ олдсон түлхүүр! = ХУДАЛ) ) буцаах $foundkey;

$a = ["x" => ["eee", "ccc"], "b" => ["zzz"]]; $ олдсон = null; $search = "ээээ"; array_walk($a, функц ($k, $v) ашиглах ($хайлт, &$ олдсон) ( хэрэв (in_array($хайлт, $k)) ( $олдсон = $v; ) )); var_dump($ олдсон);

Энд ижил зүйлд зориулсан нэг доторлогоо байна.

$pic_square = $userdb["pic_square"];

Энэ бол миний жишээ бөгөөд энэ бол миний анхны хариулт гэдгийг анхаарна уу. Би зөвхөн нэг тодорхой массив хайх хэрэгтэй байсан тул парам массивыг хассан, гэхдээ та нэгийг хялбархан нэмж болно. Би зүгээр л uid гэхээсээ илүүг хайхыг хүссэн.

Түүнчлэн, миний нөхцөл байдалд, өвөрмөц бус байж болох бусад талбаруудаар хайсны үр дүнд буцаах олон түлхүүр байж болно.

/** * @param array multidimensional * @param string утгыг хайх, өөрөөр хэлбэл тухайн талбарын нэрийг name_first гэх мэт * @param string associative key, өөрөөр хэлбэл field_name * * @return массив түлхүүр.

*/ function search_revisions($dataArray, $search_value, $key_to_search) ( // Энэ функц нь таны хайж буй ассоциатив түлхүүртэй холбоотой тодорхой утгыг // хайлт хийх болно. $keys = array(); foreach ($dataArray) $key => $cur_value) (хэрэв ($cur_value[$key_to_search] == $search_value) ($keys = $key; ) ) $keys буцаана;

Дараа нь би өөр үнэ цэнэ, ассоциатив түлхүүр хайх боломжийг олгохын тулд үүнийг бичиж дуусгасан. Тиймээс миний эхний жишээ танд ямар нэгэн тодорхой ассоциатив түлхүүрээс утгыг хайж, бүх тохирохыг буцаах боломжийг олгоно. Энэ хоёр дахь жишээ нь тодорхой нэг холбоо барих түлхүүрийн (эхний_нэр) утгыг ("Тэйлор") хаана байгааг харуулж байна.БА

өөр утга (үнэн) нь өөр ассоциатив түлхүүр (ашигласан) дээр олдож, бүх тохирохыг буцаана ("Тэйлор" гэж нэрлэгдсэн хүмүүс БА ашигласан түлхүүрүүд).

/** * @param array multidimensional * @param string $search_value Хайх утга, өөрөөр хэлбэл тодорхой "Taylor" * @param string $key_to_search Үүнийг олох ассоциатив түлхүүр, өөрөөр хэлбэл first_name * @param string $other_matching_key Холбоос Ажиллагдсан * @param string $other_matching_value-д тохирох түлхүүрийг олох түлхүүр Тухайн тохирох ассоциатив түлхүүрээс олох утга, өөрөөр хэлбэл үнэн * * @return массив түлхүүрүүд, өөрөөр хэлбэл "Тэйлор" нэртэй ажиллаж байгаа бүх хүмүүс.

$өгөгдөл = массив(массив("хэрэглээний_бүлэг" => 6, "үнэ" => 13.21, "үнийн_цэц" => 5), массив("хэрэглэлийн_бүлэг" => 8, "үнэ" => 15.25, "үнийн_цэг" => 4), массив("cust_group" => 8, "үнэ" => 12.75, "үнийн_хүй" => 10)); $findKey = search_revisions($data,"8", "cust_group", "10", "price_qty"); хэвлэх_r($findKey);

Үр дүн

Массив ( => 2)

/** * энгийн болон олон хэмжээст массивыг хайдаг * @param төрөл $needle * @param төрөл $haystack * @return boolean */ нийтийн статик функц in_array_multi($needle, $haystack)( $needle = trim($needle) if(!is_array($haystack)) return False($haystack as $key=>$value)( if(is_array($value))( if(self::in_array_multi($needle, $value)) return True; else self::in_array_multi($зүү, $утга) else if(trim($value) === trim($needle))(//харагдах байдлыг засах// error_log("$value === $зүү харагдах байдал 1 нуугдмал" гэж тохируулах); Үнэнийг буцаана; ) ) худал буцаана; )

Хэрэв та (PHP 5>=5.5.0) ашиглаж байгаа бол та үүнд зориулж өөрийн функцийг бичих шаардлагагүй, энэ мөрийг бичээд л дуусгана.

Хэрэв та зөвхөн нэг үр дүнг хүсч байвал:

$key = массив_хайлт(40489, массив_багана($userdb, "uid"));

Олон үр дүнгийн хувьд

$түлхүүрүүд = массив_түлхүүрүүд (массив_багана ($ userb, "uid"), 40489);

Хэрэв танд тайлбар дээр дурдсан ассоциатив массив байгаа бол та үүнийг дараах байдлаар хийж болно.

$түлхүүрүүд = массив_түлхүүрүүд(массивын_нэгтгэх(массив_түлхүүрүүд($хэрэглэгч), массив_багана($хэрэглэгч, "uid")),40489);

Хэрэв та PHP ашиглаж байгаа бол<5.5.0, вы можете использовать этот backport , спасибо ramsey!

Шинэчлэх. Би хэд хэдэн энгийн тест хийж байгаа бөгөөд олон үр дүнгийн маягт нь Жакубын захиалгат функцээс ч илүү хурдан юм шиг санагдаж байна!

PHP-ийн дараагийн хувилбаруудад (>=5.5.0) та энэ нэг давхаргыг ашиглаж болно:

$key = array_search("100", array_column($userdb, "uid"));

@mayhem-ийн үүсгэсэн функцийг өргөжүүлбэл, хэрэв та зүгээр л (-ын нэг хэсгийг тааруулахыг хүсвэл энэ жишээ нь илүү "тодорхой" хайлт байх болно. томхэсэг) хайлтын мөрүүд:

Функц хайлтынArrayKeyVal($sKey, $id, $array) ( foreach ($түлхүүрээр $массив => $val) ( if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) ! == худал) ( буцаах $ түлхүүр; ) ) худал буцаана )

Жишээлбэл, массив дахь утга нь Нью-Йоркт тавтай морилно уу! Танд зөвхөн "Нью-Йорк!"

Би массив дахь бүх элементүүдийг олдог un функцийг ашиглах шаардлагатай болсон. Тиймээс би Якуб Трунечекийн гүйцэтгэсэн функцийг дараах байдлаар өөрчилсөн.

Хайлтын_массив_r($зүү, $массив) ( $олдсон = массив(); foreach ($түлхүүр => $val) (хэрэв ($val == $зүү) ( array_push($ олдсон, $val); ) ) if (count($found) != 0) return $found else null;

$search1 = "демо"; $search2 = "bob"; $arr = массив("0" => "сайн уу","1" => "тест","2" => "жон","3" => массив("0" => "мартин", "1" " => "bob"),"4" => "демо"); foreach ($arr гэж $value) (if (is_array($value)) ( if (in_array($search2, $value))) ( "амжилттай" цуурайтах; //кодоо гүйцэтгэнэ ) ) else ( if ($value) == $search1) ( "амжилт" гэсэн цуурай; ) ) )

Боломжтой бол параметрийн төрлийг оруулна уу. Гэхдээ энэ нь зөвхөн int, bool, float гэх мэт энгийн төрлүүдэд ажилладаг.

$unsafe_variable = $_POST["user_id"]; $safe_variable = (int)$ unsafe_variable ; mysqli_query($conn, "INSERT INTO хүснэгт (багана) VALUES ("" . $safe_variable. "")");

Програмчлал нь синтакс ба семантикийн тухай юм. Эхнийх нь хэлний дүрмээр, хоёр дахь нь хөгжүүлэгчийн туршлагаар тодорхойлогддог. Массивуудын хувьд хөгжүүлэгч нь синтаксийг семантикаар тусгайлан ачаалж болно. Энэ нь хараахан объект биш боловч уламжлалт утгаараа массив байхаа больсон. PHP нь өөрсдийг нь оруулаад янз бүрийн төрлийн хувьсагчийн массив үүсгэх боломжийг танд олгоно. Массив элемент нь функц байж болно, өөрөөр хэлбэл массивыг бодит алгоритм, бодит утгаараа ачаалах чадвар.

Синтакс нь тогтвортой боловч хувилбараас хувилбар руу өөрчлөгддөг бөгөөд доороос дээш хүртэл үргэлж таарахгүй байж болно. Хөтөлбөрийг зөөвөрлөх чадвар нь өнгөрсөн зууны мартагдсан ололт юм. Семаль нь хөгжиж байгаа бөгөөд зөвхөн ямар ч хэлний аль ч хувилбарт хэрэглэгдэхгүй; Хэлний дүрэмд ч заагаагүй зүйлийг синтаксийн бүтцээр илэрхийлдэг уламжлал тогтжээ. Үүнийг массивын жишээг ашиглан хамгийн амархан ойлгож болно.

Массив бүтээх

PHP дахь массив нь тохиромжтой синтакс, функцтэй байдаг. Үүнийг урьдчилан тайлбарлаж болох боловч шаардлагатай бол массивыг шууд үүсгэх нь ихэвчлэн тохиромжтой байдаг.

нийтийн $aNone = массив(); // массив дүрслэгдсэн бөгөөд юу ч агуулаагүй

нийтийн $aFact = массив("авокадо", "тоор", "интоор"); // энэ массив нь гурван элементтэй

Нөхцөл байдлыг шалгах явцад массив үүсгэх:

$cSrcLine = "шинжилсэн өгөгдлийн шугам";

төлөө ($i=0; $i<13; $i++) {

хэрэв (checkFunc($cSrcLine, $cUserLine) (

$aResult = "Тийм"; // PHP массив руу нэмнэ

$aResult = "Үгүй";

Энэ жишээг гүйцэтгэсний үр дүнд 13 элементийн массив үүсэх бөгөөд тэдгээрийн утга нь зөвхөн "Тийм" эсвэл "Үгүй" гэсэн мөрүүд байх болно. Элементүүд 0-ээс 12 хүртэлх индексийг хүлээн авна. "Ирээдүйн" PHP массивыг эхлээд мөрөнд бичснээр ижил үр дүнд хүрч болно:

$cFutureArray = "";

төлөө ($i=0; $i<13; $i++) {

$ cUserLine = inputUserLine(); // ямар нэг зүйл оруулах

хэрэв ($i > 0) ( $cFutureArray .= "|"; )

if (checkFunc($cSrcLine, $cUserLine) ( $cFutureArray .= "Тийм";

) else ( $cFutureArray .= "Үгүй"; )

$aResult = тэсрэх("|", $cFutureArray);

Олон хэмжээст массив

Олон контент менежментийн системүүд (CMS) массивуудыг өргөнөөр ашигладаг. Нэг талаараа энэ нь сайн туршлага, нөгөө талаас ашиглахад хэцүү болгодог. Зохиогч "массив доторх PHP массив" сургаалыг ойлгодог байсан ч үүнийг буруугаар ашиглах ёсгүй: зөвхөн хөгжүүлэгч нарийн төвөгтэй тэмдэглэгээнд дасах шаардлагатай болно. Ихэнхдээ хэсэг хугацааны дараа бүтээгч өөрөө эхлээд бичсэн зүйлээ удаан хугацаанд санах болно.

"view_manager" => массив(41, "загвар_замын_стек" => массив(__DIR__ . "/../харах",),

"чиглүүлэгч" => массив("маршрутууд" => массив("sayhello" => массив(

"type" => "Zend\Mvc\Router\Http\Literal",

"сонголтууд" => массив("маршрут" => "/sayhello", "өгөгдмөл" => массив(

"controller" => "Helloworld\Controller\Index", "action" => "индекс",))))),

"хянагч" => массив("дэгдэлт" => массив(

"Helloworld\Controller\Index" => "Helloworld\Controller\IndexController"))

Энэ бол ZF 2-ын "Массив доторх PHP массив" практикийн жишээ юм. Эхэндээ тийм ч их урам зориг өгөхгүй ч энэ нь ажиллаж, энэ хүрээг амжилттай болгож байгаа нь маргаангүй (ZendSkeletonApplication/module/Helloworld/config/module.config.php-ийн жишээ) .

Массив нь дизайн болон хөгжүүлэлтийн явцад чухал өгөгдлийн бүтэц юм. Түүний олон хэмжээст хувилбар нь нэгэн цагт алдартай байсан боловч цаг хугацаа өнгөрөхөд хамгийн ихдээ хоёр эсвэл гурван хэмжээст массив шаардлагатай хэвээр байв. Энэ нь илүү энгийн бөгөөд ойлгомжтой бөгөөд мэргэжлийн үүднээс авч үзвэл ямар нэг зүйл үржиж эхлэхэд асуудлын мэдэгдэл эсвэл кодонд ямар нэг зүйл буруу байна гэсэн үг юм.

Энгийн, хүртээмжтэй, ойлгомжтой

PHP дээр массив дотор массив үүсгэхдээ өөрийгөө хоёр эсвэл гурван түвшинд хязгаарлах нь дээр. PHP-ийн тогтвортой байдал, найдвартай байдлыг үл харгалзан синтаксийн бүтцийг боловсруулахдаа алдаа гаргадаг. Хэрэв та сайн код засварлагчтай бол хашилт, таслалыг зөв тоолж хэвшвэл үүнийг тэвчиж чадна. Гэсэн хэдий ч PHP нь өгөгдлийн төрлүүдийг хянадаггүй (энэ нь орчин үеийн програмчлалын үйлийн үр) бөгөөд хөгжүүлэгчид семантик алдааг дадлага хийх боломжийг олгодог.

Хувьсагчийн төрлийг хянах дүрэм эсвэл семантикийг синтакс болгон хувиргах өөрийн санаанууд нь ихэвчлэн үнэд хүрэхийн аргагүй тансаг байдал юм. Энэ нь скриптийн хурд, код унших чадвар алдагдах, ... учир нь кодчилолд хялбар байх нь үргэлж чухал байдаг.

PHP нь мэдэгдэхүйц сөрөг шинж чанартай: тодорхойгүй байдал үүсэх үед скрипт зүгээр л хөлддөг. Бүх дибаг хийгчид урьдчилан таамаглаагүй нөхцөл байдлыг даван туулж чаддаггүй бөгөөд хөгжүүлэгчийн туршлага, зөн совингоос их зүйл шалтгаална. Алгоритм нь энгийн байх тусмаа мэдээлэл нь илүү хүртээмжтэй бүтэцтэй байх тусам алдааг олж илрүүлэх, түүнээс бүрэн сэргийлэх боломж нэмэгддэг.

Анхны массивууд гарч ирэхэд бүтцийн хэлбэрээр өгөгдлийн хувилбаруудыг санал болгосон нь онцлог шинж чанартай бөгөөд энэ нь өөр өөр төрлийн өгөгдлийн төрлөөс ямар нэгэн зүйл үүсгэх болхи оролдлого юм. Эхнийх нь амьд үлдэж, шинэ үр дүнтэй синтаксийг олж авсан бол сүүлийнх нь түүх болжээ.

Энгийн ба ассоциатив массивууд

Хоёр хэмжээст массивын тэмдэглэгээ нь өөр нэг хос хаалт "[" ба "], жишээ нь: $aSrcData гэдэг нь $aSrcData массив дахь массивын элементэд хандахыг хэлнэ. PHP дээр өгөгдлийг урьдчилан зарлах шаардлага байхгүй. Аливаа заасан мэдээлэл байгаа эсэхийг үргэлж шалгаж болно.

Аливаа зүйлийг шаардлагатай үед нь, шаардлагатай байсан хэлбэрээр нь бүтээж, хэрэгцээ нь алга болсон үед нь устгадаг нь маш үр дүнтэй байдаг. Түлхүүр (индекс) болгон утга учиртай нэрсийг ашигласнаар та алгоритм дахь одоогийн байршлын хувьд утга учиртай уншигдахуйц бүтцийг авч болно.

$aAnketa["name"] = "Иванов";
$aAnketa["нас"] = 42;
$aAnketa["ажил"] = "Захирал";
$aAnketa["идэвхтэй"] = үнэн;
$aTable = $aAnketa;

$aAnketa["name"] = "Петров";
$aAnketa["нас"] = 34;
$aAnketa["ажил"] = "Менежер";
$aAnketa["идэвхтэй"] = үнэн;
$aTable = $aAnketa;

$aAnketa["name"] = "Афанасьев";
$aAnketa["нас"] = 28;
$aAnketa["ажил"] = "Ажилчин";
$aAnketa["идэвхтэй"] = худал;
$aTable = $aAnketa;

$sOne .= implode ("; ", $aTable) . "
"; // хоёр дахь РНР массивыг мөр болгон оруулна
$sOne .= $aХүснэгт["ажил"]; // хоёр дахь массивын нэг элементэд хандах

Энэ жишээний үр дүн (эхний массив хэвийн, түүн доторх товчлуурууд 0-ээс эхэлдэг, хоёр дахь массив нь ассоциатив, "нэр", "нас", "ажил", "идэвхтэй" гэсэн дөрвөн түлхүүртэй):

$sOne = "Петров; 34; Менежер; 1
Менежер";

Энэхүү энгийн жишээ нь үүсгэсэн асуулгын хуудсыг бүх ажилчдад хэрхэн хэрэглэж болохыг харуулж байна. Та ажилтнуудын тоогоор индексжүүлсэн ажилчдын массив үүсгэж, хэрэв танд тодорхой ажилтан хэрэгтэй бол түүнийг боловсон хүчний дугаараар нь сонгож болно.

Байгууллага хэлтэстэй, улирлын чанартай ажилчидтай, эсвэл ажиллаж байгаа тэтгэвэр авагчдыг тусад нь тодорхойлох шаардлагатай бол ... "массив дахь PHP массив" загвар нь маш тохиромжтой, гэхдээ та хэзээ ч хэмжээст байдалд бүү авт. Хоёр буюу гурван хэмжээс нь үр дүнтэй шийдлийн хязгаар юм.

Массивтай ажиллах түлхүүрүүд

Хэрэв өмнө нь бүх зүйл хэрхэн зохион байгуулагдсан нь чухал байсан бол сүүлийн жилүүдэд програмистууд массивын элементүүд яг хэрхэн хадгалагдаж байгааг мэдэхийг хүсч, тэдгээрт шууд хандахыг хүсдэг байсан хоёртын үеийн уламжлал бүрэн мартагдсан. Санах ойд нэг байтаас илүү зай эзэлдэг олон тэмдэгтийн кодчилолууд гарч ирэв. "Бит" гэдэг үгийг одоо зөвхөн битийн хайлтын үйлдлүүдээс олж болно, гэхдээ PHP массивыг хайх нь тусдаа сэдэв юм. Элементүүдэд хандах нь энгийн бөгөөд холбоотой байж болно. Эхний тохиолдолд массивын элементүүдийг (PHP-д байдаг аль нэг төрлүүдтэй) 0, 1, 2, ... гэсэн тоогоор дугаарлана. Хоёр дахь тохиолдолд программист өөрийн индексийг зааж өгдөг бөгөөд үүнийг ихэвчлэн "түлхүүр" гэж нэрлэдэг. хүссэн утга.

$aLine["жимс"] = "улбар шар"; // энд PHP массив түлхүүр = "жимс"

эсвэл (хуудасны кодчилол болон кодыг харгалзан бүх зүйл зөв байхын тулд):

$aLine = iconv("UTF-8", "CP1251", "улбар шар");

$aLine массивт шинэ утга нэмэх үед:

$aLine = iconv("UTF-8", "CP1251", "тоор");
$aLine = iconv("UTF-8", "CP1251", "өргөст хэмх");
$aLine = iconv("UTF-8", "CP1251", "хаш");

гогцоог гүйцэтгэсний үр дүнд:

foreach ($aLine нь $ck => $cv) (
$cOne .= $ck . "=" . $cv . "
";
}

хүлээн авах болно:

жимс = улбар шар
0=тоор
хүнсний ногоо = өргөст хэмх
1 = хаш

"Тор" ба "хаш" элементүүдийг нэмэхэд PHP массив түлхүүр нь 0-ээс дараалан үүсдэг бөгөөд түүний утгыг зааж өгөх үед энэ утгатай тэнцүү байх болно.

Массиваас элементүүдийг устгаж байна

Хамгийн хялбар арга бол түүнийг боловсруулах явцад юм. Энэ тохиолдолд, жишээлбэл, давталтыг гүйцэтгэсний үр дүнд анхны массивыг сканнердаж, шаардлагагүй элементүүдийг зүгээр л бичдэггүй шинэ массив үүсдэг.

Энэ нь илүү хялбар байж болох юм. Хэрэв бид сүүлчийн жишээнд хэрэглэвэл:

тохируулаагүй($aLine); // PHP массив элементийг устгах

Дараа нь үр дүн нь:

жимс = улбар шар
хүнсний ногоо = өргөст хэмх
1 = хаш

Массивын элементүүдийг удирдах олон сонголт байдаг. Жишээ нь: implode() болон explode() функцуудыг ашигласнаар та PHP массивыг нэг хязгаарлагчтай мөрт бичиж, өөр хязгаарлагч ашиглан өөр массив болгон задлан шинжилж болно.

PHP дээр массивыг бүхэлд нь устгахын тулд: unset($aLine);

Энэ хангалттай.

Массив дотор хайх

PHP нь тусгай хайлт болон in_array() функцуудыг агуулдаг боловч та тэдгээрийг ашиглахаар шийдэхээсээ өмнө PHP массивын хайлтыг өөрөө хийх талаар бодох хэрэгтэй.

Аливаа төсөл нь тусгайлан бүтээгдсэн массивтай байдаг, ялангуяа семантикийн хэсэг нь синтакс руу шилжиж, маш тодорхой утгатай түлхүүрүүдийн багцаар илэрхийлэгддэг. Энэ нь танд өөрийн хайлтын функцийг гүйцэтгэх боломжийг олгодог бөгөөд үүнийг утга учиртай байдлаар тэмдэглэж болно.

PHP дээр та программыг гүйцэтгэх явцад нэр нь тодорхойлогдсон функцуудыг дуудаж болно. MS Word баримт бичгийг унших, үүсгэх боломжийг олгодог PHPWord номын сангаас маш практик жишээ:

$элементүүд = массив("Текст", "Inline", "TextRun", "Холбоос", "Текстийг хадгалах", "TextBreak",
"ListItem", "ListItemRun", "Хүснэгт", "Зураг", "Объект", "Зүүлт тайлбар",
"Төгсгөлийн тайлбар", "CheckBox", "TextBox", "Талбар", "Мөр");

$функцууд = массив();

төлөө ($i = 0; $i< count($elements); $i++) {
$functions[$i] = "нэмэх". $элементүүд[$i];
}

Үүний үр дүнд $ functions массив нь $ элементүүдийн массивын утгуудыг, өөрөөр хэлбэл бодит баримт бичгийн элементүүдтэй ажилладаг бодит функцүүдийн нэрийг хүлээн авах болно.

$element дээрх $functions функцийг дуудсанаар та төгс хайлт, хурдан үр дүнд хүрч чадна.

Зүйлүүдийг эрэмбэлэх

Өгөгдлийг эрэмбэлэх даалгавар нь чухал бөгөөд PHP нь үүнд зориулж хэд хэдэн функцийг санал болгодог: sort(), rsort(), asort(), ksort(), ... Өсөх ба буурах элементүүд, хоёр дахь хоёр функц нь түлхүүр ба утгын хоорондын хамаарлыг хадгалдаг. . Заримдаа массивын утгыг санамсаргүй байдлаар холих нь утга учиртай байдаг - shuffle().

PHP функцийг эрэмбэлэхдээ ашиглахдаа элементүүд нь зөвхөн өөр өөр төрлүүдтэй байхаас гадна бүхэлдээ байгалийн агуулгатай байж болохгүй гэдгийг мартаж болохгүй. Юуны өмнө та орос үсэг агуулсан мөрүүдийг эрэмбэлэх, огноо, мөн өөр өөр форматаар бичигдсэн тоонуудыг эрэмбэлэх талаар маш болгоомжтой байх хэрэгтэй.

Наад зах нь скриптийг турших үе шатанд хамгийн тохиромжтой шийдлийг өөрөө бичих хамгийн сайн арга бол гараар эрэмбэлэх явдал юм. Энэ нь урьдчилан таамаглаагүй нөхцөл байдлыг урьдчилан таамаглахад тусална.

Мөрний массив

implode() болон explode() функцуудын ачаар массивыг хялбархан мөр болгон хувиргаж, буцааж буцааж болно. Энэ нь өгөгдлийг авсаархан дүрслэлд хадгалах, шаардлагатай бол тохиромжтой төлөвт өргөжүүлэх боломжийг олгоно.

Мөр рүү хөрвүүлсэн массив нь шинэ боломжуудыг нээж өгдөг. Жишээлбэл, текстээс түлхүүр үг хайх даалгавар нь олдсон зүйлийг дахин нэмэхгүй байхыг шаарддаг.

$cSrcLine = "Текст бичвэрийн жагсаалтItemRun TextBox ListItem TextBox Checkbox CheckBox TextBox зүүлт";

$aSrc = тэсрэх(" ", $cSrcLine);
$cDstLine = "";

төлөө ($i=0; $i< count($aSrc); $i++) {
$cFind = "[" . $aSrc[$i] . "]";
хэрэв (! is_integer(strpos($cDstLine, $cFind)))) (
$cDstLine.= $cFind;
}
}
$aDst = тэсрэх("][", $cDstLine);

$cOne = implode("; ", $aDst);

Үүний үр дүнд $cOne хувьсагч нь зөвхөн нэг удаа гарч ирэх эх сурвалжаас утгуудыг хүлээн авах болно: "Text; ListItemRun; TextBox; ListItem; Check; Box; CheckBox; Зөөлбар".

Орос хэл нь түлхүүр ба утгаараа

Синтаксийн бүтцэд үндэсний кодчилолтой холбоотой зүйлийг ашиглахыг зөвлөдөггүй. Орос хэл нь тэмдэгтүүд нь a-z-ээс давсан бусад бүх хэлнүүдийн нэгэн адил өгөгдлийн бүсэд байх нь асуудал үүсгэхгүй, харин кодын синтакс биш юм. Заримдаа PHP дээр "хэвлэгч эсвэл дэлгэц рүү массив гаргах" энгийн ажил ч "галзуу алдаа" үүсгэдэг бөгөөд ихэнхдээ скрипт зүгээр л зогсдог.

PHP нь үнэнч хэл бөгөөд үндэсний кодчилолд тэсвэртэй боловч гол утга нь зөв газар, зөв ​​цагт гарч ирсний улмаас дуусгасан ажлыг дахин хийх шаардлагатай олон нөхцөл байдал байдаг. таних.

PHP синтакс ба хэлний орчин

PHP синтакс нь нэг зүйл гэдгийг санах нь зүйтэй, гэхдээ энэ синтаксийн бүтэц нь бусад програмууд, үйлдлийн системүүд, техник хангамжийн сонголтуудтай "харьцдаг". Олон сонголт байдаг, бүх зүйлийг хангах боломжгүй.

"Зөвхөн кодонд код байдаг, гэхдээ оролт, дотор, гаралт дээр бүх төрлийн мэдээлэл байдаг" дүрэм нь гэнэтийн гэнэтийн зүйлээс зайлсхийхэд тусална. Массив дахь PHP утга нь "Орос" байж болох ч түүний түлхүүр нь тухайн хэлний үүднээс төдийгүй үйлдлийн орчны үүднээс синтаксийн хувьд зөв байх ёстой.