Php dizi değerindeki elemanı buluyor. PHP array_search: Bir dizideki değeri arayın. PHP sözdizimi ve dil ortamı

Programlama sözdizimi ve anlambilim ile ilgilidir. Birincisi dilin kurallarına göre belirlenir, ikincisi ise geliştiricinin tecrübesine göre belirlenir. Dizilerle ilgili olarak geliştirici, sözdizimini anlambilimle özel olarak yükleyebilir. Bu henüz bir nesne değil ama artık geleneksel anlamda bir dizi değil. PHP size kendileri de dahil olmak üzere çeşitli türlerde değişkenlerden oluşan diziler oluşturma yeteneği verir. Bir dizi öğesi bir fonksiyon, yani diziyi gerçek bir algoritmayla, gerçek anlamda yükleme yeteneği olabilir.

Sözdizimi sabittir ancak sürümden sürüme değişir ve en alttan en üste doğru bile her zaman uyumlu olmayabilir. Program taşınabilirliği geçen yüzyılın unutulmuş bir başarısıdır. Anlambilim gelişmektedir ve her zaman yalnızca herhangi bir dilin herhangi bir sürümüne uygulanamaz; Dil kurallarının bile öngörmediği şeyleri ifade etmek için sözdizimsel yapıları kullanmak bir gelenek haline geldi. Bu, diziler örneği kullanılarak en kolay şekilde anlaşılabilir.

Diziler Oluşturma

PHP'deki dizi kullanışlı bir sözdizimine ve işlevselliğe sahiptir. Bu önceden açıklanabilir, ancak gerektiğinde anında diziler oluşturmak genellikle uygundur.

public $aNone = dizi(); // dizi tanımlanıyor ve hiçbir şey içermiyor

public $aFact = array("avokado", "şeftali", "kiraz"); // bu dizinin üç elemanı var

Bir koşulu kontrol ederken bir dizi oluşturma:

$cSrcLine = "analiz edilen veri satırı";

için ($i=0; $i<13; $i++) {

if (checkFunc($cSrcLine, $cUserLine) (

$aResult = "Evet"; // PHP dizisine ekle

$aResult = "Hayır";

Bu örneğin uygulanması sonucunda, değerleri yalnızca "Evet" veya "Hayır" dizeleri olacak 13 öğeden oluşan bir dizi oluşturulacaktır. Öğeler 0'dan 12'ye kadar dizinler alacaktır. Aynı etki, önce "gelecekteki" PHP dizisini bir dizeye yazarak elde edilebilir:

$cFutureArray = "";

için ($i=0; $i<13; $i++) {

$cUserLine = inputUserLine(); // bir şey girin

if ($i > 0) ( $cFutureArray .= "|"; )

if (checkFunc($cSrcLine, $cUserLine) ( $cFutureArray .= "Evet";

) else ( $cFutureArray .= "Hayır"; )

$aResult = patlayabilir("|", $cFutureArray);

Çok boyutlu diziler

Birçok içerik yönetim sistemi (CMS) dizileri büyük ölçüde kullanır. Bu bir yandan iyi bir uygulamadır, diğer yandan kullanımını zorlaştırır. Yazar "dizi içinde PHP dizisi" doktrinini anlasa bile, bunu kötüye kullanmamalıdır: yalnızca geliştiricinin karmaşık gösterime alışması gerekmeyecektir. Çoğu zaman, bir süre sonra yaratıcının kendisi ilk başta yazdıklarını uzun süre hatırlayacaktır:

"view_manager" => array(41, "template_path_stack" => array(__DIR__ . "/../view",),

"yönlendirici" => array("rotalar" => array("merhaba" => array(

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

"seçenekler" => array("rota" => "/merhaba", "varsayılanlar" => array(

"controller" => "Helloworld\Controller\Index", "action" => "index",))))),

"kontrolörler" => dizi("çağrılabilirler" => dizi(

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

Bu, ZF 2'nin "dizi içinde PHP dizisi" uygulamasının bir örneğidir. İlk başta pek ilham verici olmasa da işe yarıyor ve muhtemelen bu çerçeveyi başarılı kılıyor (örnek ZendSkeletonApplication/module/Helloworld/config/module.config.php'den) .

Dizi, tasarım ve geliştirme sırasında önemli bir veri yapısıdır. Çok boyutlu versiyonu bir zamanlar popülerdi ancak zamanla maksimum iki veya üç boyutlu dizilere ihtiyaç duyuldu. Bu şekilde daha basit ve anlaşılır oluyor ve profesyonel açıdan bakıldığında bir şeyler çoğalmaya başladığında bu, problem ifadesinde veya kodda bir şeylerin yanlış olduğu anlamına gelir.

Basit, erişilebilir ve anlaşılır

PHP'de bir dizi içinde bir dizi oluştururken kendinizi iki veya üç düzeyle sınırlamak en iyisidir. PHP'nin kararlılığına ve güvenilirliğine rağmen sözdizimsel yapıları işlerken hatalar yapar. İyi bir kod düzenleyiciniz varsa ve parantezleri ve virgülleri doğru bir şekilde saymaya alışırsanız buna katlanabilirsiniz. Ancak PHP veri türlerini kontrol etmez (bu modern programlamanın karmasıdır) ve geliştiricinin anlamsal hatalar yapmasına izin verir.

Anlambilimi sözdizimine dönüştürmek için değişken türlerini veya kendi fikirlerinizi kontrol etme kuralı genellikle karşılanamaz bir lükstür. Bu, komut dosyası hızı ve kodun okunabilirliği kaybıdır, çünkü kodlamada basitlik her zaman önemlidir.

PHP'nin önemli bir olumsuz özelliği vardır: belirsizlik ortaya çıktığında komut dosyası donar. Tüm hata ayıklayıcılar öngörülemeyen durumların üstesinden gelemez ve çoğu şey geliştiricinin deneyimine ve sezgisine bağlıdır. Algoritma ne kadar basit olursa, bilgi ne kadar erişilebilir olursa, bir hata bulma veya onu tamamen önleme şansı da o kadar artar.

İlk diziler ortaya çıktığında, veri çeşitlerinin yapılar şeklinde önerilmesi karakteristiktir; bu, farklı veri türlerinden bir şey yaratmaya yönelik beceriksiz bir girişimdir. Birincisi hayatta kaldı ve yeni, etkili bir sözdizimi kazandı, ikincisi ise tarih oldu.

Basit ve ilişkisel diziler

İki boyutlu bir dizinin gösterimi başka bir parantez "[" ve ​​"]" çiftidir; örneğin: $aSrcData, $aSrcData dizisinde yer alan bir dizi öğesine erişim anlamına gelir. PHP'de verileri önceden bildirmeye gerek yoktur. Belirtilen herhangi bir bilginin varlığı her zaman doğrulanabilir.

Bir şeyi ancak ihtiyaç duyulduğunda, gerektiği biçimde yaratmak, ihtiyaç ortadan kalktığında ise onu yok etmek çok etkilidir. Anlamlı adları anahtarlar (indeksler) olarak kullanarak, algoritmadaki mevcut yer bağlamında anlamlı olan okunabilir yapılar elde edebilirsiniz:

$aAnketa["isim"] = "İvanov";
$aAnketa["yaş"] = 42;
$aAnketa["work"] = "Yönetmen";
$aAnketa["aktif"] = doğru;
$aTable = $aAnketa;

$aAnketa["name"] = "Petrov";
$aAnketa["yaş"] = 34;
$aAnketa["iş"] = "Yönetici";
$aAnketa["aktif"] = doğru;
$aTable = $aAnketa;

$aAnketa["name"] = "Afanasyev";
$aAnketa["yaş"] = 28;
$aAnketa["iş"] = "İşçi";
$aAnketa['aktif'] = false;
$aTable = $aAnketa;

$sOne .= patlama ("; ", $aTable) . "
"; // ikinci PHP dizisini bir dizgeye dönüştürüyoruz
$sOne .= $aTable["iş"]; //ikinci dizinin bir elemanına erişim

Bu örneğin sonucu (ilk dizi normaldir, içindeki tuşlar 0'dan başlar, ikinci dizi ilişkiseldir, dört anahtarı vardır: "isim", "yaş", "iş", "etkin"):

$sOne = "Petrov; 34; Yönetici; 1
Müdür";

Bu basit örnek, oluşturulan bir anketin tüm çalışanlara nasıl uygulanabileceğini göstermektedir. Personel numaralarına göre indekslerle bir çalışan dizisi oluşturabilir ve belirli bir çalışana ihtiyacınız varsa onu personel numarasına göre seçebilirsiniz.

Organizasyonun bölümleri varsa veya mevsimlik işçiler varsa veya çalışan emeklileri ayrı ayrı tanımlamanız gerekiyorsa, ... "PHP dizisi bir dizide" tasarımı çok kullanışlıdır, ancak boyuta asla kapılmamalısınız. Etkili bir çözümün sınırı iki veya üç boyuttur.

Dizilerle çalışma tuşları

Önceleri her şeyin nasıl düzenlendiği önemliyse, son yıllarda programcının bir dizinin öğelerinin tam olarak nasıl saklandığını bilmek istediği ve onlara doğrudan erişim sağlamak istediği ikili çağın gelenekleri tamamen unutuldu. Bellekte birden fazla bayt yer kaplayan birçok karakter kodlaması ortaya çıktı. "Bit" kelimesi artık yalnızca bit arama işlemlerinde bulunabiliyor, ancak PHP dizisini aramak ayrı bir konudur. Öğelere erişim basit ve ilişkisel olabilir. İlk durumda, dizi öğeleri (PHP'de mevcut türlerden herhangi birine sahip olan) 0, 1, 2, ... olarak numaralandırılır. İkinci durumda, programcı erişim için genellikle "anahtar" adı verilen kendi dizinini belirler. istenilen değer.

$aLine["meyve"] = "turuncu"; // burada PHP dizi anahtarı = "meyve"

veya (sayfa kodlamasına ve koduna saygı göstererek her şeyin doğru olması için):

$aLine = iconv("UTF-8", "CP1251", "turuncu");

$aLine dizisine yeni bir değer eklerken:

$aLine = iconv("UTF-8", "CP1251", "şeftali");
$aLine = iconv("UTF-8", "CP1251", "salatalık");
$aLine = iconv("UTF-8", "CP1251", "patlıcan");

döngünün yürütülmesinin bir sonucu olarak:

foreach ($aLine as $ck => $cv) (
$cBir .= $ck . "=" . $cv . "
";
}

Alınacak:

meyve=portakal
0=şeftali
sebze=salatalık
1=patlıcan

PHP dizi anahtarı “şeftali” ve “patlıcan” elemanlarını eklerken sırayla 0'dan oluşturulur ve değeri belirtilirken bu değere eşit olacaktır.

Bir diziden öğeleri kaldırma

En kolay yol, işlenmesi sırasındadır. Bu durumda, örneğin, bir döngünün yürütülmesi sonucunda, orijinal dizi taranır ve içine gereksiz öğelerin yazılmadığı yeni bir dizi oluşturulur.

Daha kolay olabilir. Son örneğe başvurursak:

unset($aLine); // PHP dizi elemanını kaldır

o zaman sonuç şöyle olacaktır:

meyve=portakal
sebze=salatalık
1=patlıcan

Dizi elemanlarını değiştirmek için birçok seçenek vardır. Örneğin, implode() ve patlat() işlevlerini kullanarak, bir PHP dizisini bir sınırlayıcıyla bir dizeye yazabilir ve onu farklı bir sınırlayıcı kullanarak başka bir diziye geri ayrıştırabilirsiniz.

PHP'de bir dizinin tamamını silmek için şunu yazmanız yeterlidir: unset($aLine);

Yeter.

Bir dizide arama yapın

PHP özel arama ve in_array() işlevlerini içerir, ancak bunları kullanmaya karar vermeden önce PHP dizi aramalarını kendiniz yapmayı düşünmelisiniz.

Herhangi bir projenin, özellikle anlambilimin bir kısmı sözdizimine aktarıldığında ve çok özel anlamlı anahtarlar kümesiyle temsil edildiğinde, özel oluşturulmuş dizileri vardır. Bu, anlamlı bir şekilde etiketlenebilen kendi arama işlevlerinizi gerçekleştirmenize olanak tanır.

PHP'de programın yürütülmesi sırasında adı belirlenen işlevleri çağırabilirsiniz. MS Word belgelerini okumanıza ve oluşturmanıza olanak tanıyan PHPWord kütüphanesinden çok pratik bir örnek:

$elements = array("Metin", "Satır İçi", "TextRun", "Bağlantı", "PreserveText", "TextBreak",
"ListItem", "ListItemRun", "Tablo", "Resim", "Nesne", "Dipnot",
"Sonnot", "CheckBox", "TextBox", "Alan", "Satır");

$işlevler = dizi();

için ($i = 0; $i< count($elements); $i++) {
$functions[$i] = "ekle" . $elemanlar[$i];
}

Sonuç olarak, $functions dizisi $elements dizisinin değerlerini, yani gerçek belge öğeleriyle çalışan gerçek işlevlerin adlarını alacaktır.

$elements üzerinde $functions'ı çağırarak mükemmel bir arama ve hızlı sonuçlar elde edebilirsiniz.

Öğeleri sıralama

Verileri sıralama görevi önemlidir ve PHP bunun için çeşitli işlevler sunar: sort(), rsort(), asort(), ksort(), ... Artan ve azalan öğeler, ikinci iki işlev anahtarlar ve değerler arasındaki ilişkileri saklar. . Bazen dizi değerlerini rastgele karıştırmak mantıklıdır - shuffle().

Sıralama için PHP işlevlerini kullanırken, öğelerin yalnızca farklı türlerde olamayacağını, aynı zamanda tamamen doğal içeriğe de sahip olamayacağını unutmamalısınız. Öncelikle Rusça harfler içeren dizeleri, tarihleri ​​ve farklı formatlarda yazılan sayıları sıralama konusunda çok dikkatli olmanız gerekiyor.

İdeal çözümü kendiniz yazmanın en iyi yolu, en azından betiği test etme aşamasında, manuel sıralamadır. Öngörülemeyen durumların önceden tahmin edilmesine yardımcı olacaktır.

Dize Dizileri

implode() veblast() işlevleri sayesinde bir dizi kolaylıkla bir dizeye dönüştürülebilir ve geri döndürülebilir. Bu, verileri kompakt bir gösterimde saklamanıza ve gerektiğinde uygun bir duruma genişletmenize olanak tanır.

Dizgeye dönüştürülen bir dizi yeni olasılıkların kapısını aralar. Örneğin bir metindeki anahtar kelimeleri arama görevi, bulunan şeyin tekrar eklenmemesini gerektirir.

$cSrcLine = "Metin Metin ListItemRun TextBox ListItem TextBox Onay Kutusu CheckBox TextBox Dipnot";

$aSrc = patla(" ", $cSrcLine);
$cDstLine = "";

için ($i=0; $i< count($aSrc); $i++) {
$cBul = "[" . $aSrc[$i] . "]";
if (! is_integer(strpos($cDstLine, $cFind)))) (
$cDstLine .= $cFind;
}
}
$aDst = patlayabilir("][", $cDstLine);

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

Sonuç olarak, $cOne değişkeni kaynak dizeden yalnızca orada bir kez görünen değerleri alacaktır: "Text; ListItemRun; TextBox; ListItem; Check; Box; CheckBox; Footnote".

Anahtarlar ve anlamlarla Rus dili

Sözdizimsel yapılarda ulusal kodlamalarla ilgili herhangi bir şeyin kullanılması önerilmez. Karakterleri a'dan z'ye uzanan diğer tüm diller gibi Rusça da veri bölgesinde olması ancak kod sözdiziminde olmaması nedeniyle sorun yaratmayacaktır. Bazen PHP'deki basit bir görev bile "bir diziyi yazıcıya veya ekrana çıkarmak" "çılgın hatalara" yol açar ve çoğu zaman komut dosyası durur.

PHP sadık bir dildir ve ulusal kodlamalara karşı toleranslıdır, ancak tamamlanan işin yalnızca bir anahtar değerin doğru yerde ve doğru zamanda ortaya çıkması nedeniyle tekrar yapılması gerektiği birçok durum vardır ve bu da mümkün değildir. tanımak.

PHP sözdizimi ve dil ortamı

PHP sözdiziminin bir şey olduğu unutulmamalıdır, ancak bu sözdiziminin yapıları diğer uygulamalarla, işletim sistemiyle ve donanım seçenekleriyle "anlaşır". Seçenek çok, her şeyi sağlamak hiçbir zaman mümkün olmuyor.

“Kodun içinde sadece kod var ama girişinde, içinde ve çıkışında her türlü bilgi var” kuralı öngörülemeyen sürprizlerin önlenmesine yardımcı olacaktır. Bir dizideki PHP değeri "Rusça" olabilir, ancak anahtarının sözdizimsel olarak yalnızca verilen dil açısından değil, aynı zamanda işletim ortamı açısından da doğru olması gerekir.

çok boyutlu (18)

Array_search fonksiyonunu açıklamak için aşağıdaki örneklerden birini değiştirdim. searchItemsByKey işlevi, çok boyutlu bir diziden (N düzey) $anahtarına göre tüm değerleri döndürür. Belki bu birisi için yararlı olabilir. Örnek:

$arr = array("XXX"=>array("YYY"=> array("AAA"=> array("keyN" =>"değer1")), "ZZZ"=> array("BBB"=> dizi ("anahtarN" => "değer2")) //.....)); $sonuç = searchItemsByKey($dizi,"anahtarN"); Yazdır "

"; print_r($sonuç); yazdır " 
"; // ÇIKIŞ Dizisi ( => değer1 => değer2)

İşlev kodu:

Function searchItemsByKey($array, $key) ( $results = array(); if (is_array($array)) ( if (isset($array[$key]) && key($array)==$key) $results = $dizi[$anahtar]; foreach ($dizi as $alt_dizi) $sonuçlar = array_merge($sonuçlar, searchItemsByKey($alt_dizi, $anahtar)); return $sonuçlar;

Kullanıcı kimliğini aramak ve dizinin anahtarını almak istediğim bir dizim var.

Örnekler

Aşağıdaki iki boyutlu diziye sahip olduğumuzu varsayalım:

$userdb = array(array("uid" => "100", "name" => "Sandra Shush", "pic_square" => "urlof100"), array("uid" => "5465", "name" => "Stefanie Mcmohn", "pic_square" => "urlof100"), array("uid" => "40489", "name" => "Michael", "pic_square" => "urlof40489"));

search_by_uid(100) (ilk kullanıcının kullanıcı kimliği) çağrıldığında 0 döndürülmelidir.

search_by_uid(40489) işlev çağrısının 2 değerini döndürmesi gerekir.

Döngüler oluşturmayı denedim ama daha hızlı yürütülebilir koda ihtiyacım var.

Jakub'un mükemmel cevabını temel alarak, anahtarı belirtmenize izin verecek daha genelleştirilmiş bir arama burada (yalnızca kullanıcı kimliği için değil):

Function searcharray($value, $key, $array) ( foreach ($array as $k => $val) ( if ($val[$key] == $value) ( ​​return $k; ) ) return null )

Kullanım: $sonuçlar = searcharray("aramadeğeri", aramaanahtarı, $dizi);

Function searchForId($id, $array) ( foreach ($array as $key => $val) ( if ($val["uid"] === $id) ( return $key; ) ) return null; )

Çalışacak. Bunu şu şekilde çağırmalısınız:

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

=== kullanıyorsanız, karşılaştırılan operatör türlerinin tamamen aynı olması gerektiğini bilmeniz önemlidir; bu örnekte, dize aramanız veya === yerine yalnızca == kullanmanız gerekir.

Cevap temel alınarak Angora. PHP'nin sonraki sürümlerinde (>= 5.5.0) tek satırlık yazı kullanabilirsiniz.

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

Bu eski bir soru olmasına ve kabul edilmiş bir cevabı olmasına rağmen, kabul edilen cevapta bir değişiklik önereceğimi düşündüm. Dolayısıyla öncelikle burada kabul edilen cevabın doğru olduğuna katılıyorum.

Function searchArrayKeyVal($sKey, $id, $array) ( foreach ($array as $key => $val) ( if ($val[$sKey] == $id) ( return $key; ) ) return false; )

Bunun yerine, önceden ayarlanmış "uid" değerini işlevdeki bir parametreyle değiştirin; böylece aşağıdaki kodu çağırmak, bir işlevi birden çok dizi türü için kullanabileceğiniz anlamına gelir. Küçük bir değişiklik ama biraz farklı.

// Kullanıcıların Dizi Verileri $userdb = dizi (array ("uid" => "100", "isim" => "Sandra Shush", "url" => "urlof100"), dizi ("uid" => " 5465, "name" => "Stefanie Mcmohn," url" => "urlof100"), dizi ("uid" => "40489," name" => "Michael,"url" => "urlof40489) "),); // Dizinin Anahtarını Alın $arrayKey = searchArrayKeyVal("uid", "100", $userdb); if ($arrayKey!==false) ( echo "Arama Sonucu: ", $userdb[$arrayKey]["name"]; ) else ( echo "Arama Sonucu bulunamadı"; )

If(! function_exists("arraySearchMulti"))( function arraySearchMulti($search,$key,$array,$returnKey=false) ( foreach ($array as $k => $val) ( if (isset($val[$) anahtar])) ( if ((string)$val[$anahtar] == (string)$search) ( return ($returnKey ? $k: $val); ) )else( return (is_array($val) ? arraySearchMulti ($search,$key,$val,$returnKey) : null ) ) return null ))

bu işlevi kullanabilirsiniz; https://github.com/serhatozles/ArrayAdvancedSearch

="2""; $Array = array("a" => array("d" => "2"), array("a" => "Örnek Dünya", "b" => "2"), array("c" => "3"), array("d" => "4")), $Result = ArraySearch($Array,$query,1);

"; print_r($Sonuç); echo "
"; // Çıktı: // Dizi // (// => Dizi // (// [a] => Örnek Dünya // [b] => 2 //) // //)

Eğer soru, yani.

$a = [ [ "_id" => "5a96933414d48831a41901f2", "discount_amount" => 3,29, "indirim_id" => "5a92656a14d488570c2c44a2", ], [ "_id" => "5a9790fd14d48879cf16a9e8" , "indirim_tutarı" => 4,53, " indirim_id" => "5a9265b914d488548513b122", ], [ "_id" => "5a98083614d488191304b6c3", "discount_amount" => 15,24, "discount_id" => "5a92806a14d48858ff5c2ec3", ], [ "_id" "5a982a4914d48824721eafe3", "discount_amount" => 45,74, "discount_id" => "5a928ce414d488609e73b443", ], [ "_id" => "5a982a4914d48824721eafe55", "discount_amount" => 10,26, "discount_id" => "5a928ce414d488609e73 b44 3", ], ];

Function searchForId($id, $array) ( $did=0; $dia=0; foreach ($array as $key => $val) ( if ($val["discount_id"] === $id) ( $ dia +=$val["indirim_miktarı"]; $did++; ) if($dia != "") ( echo $dia; var_dump($did); ) return null); print_r(searchForId("5a928ce414d488609e73b443",$a));

Bunu da dene

Function search_in_array($srchvalue, $array) ( if (is_array($array) && count($array) > 0) ( $foundkey = array_search($srchvalue, $array); if ($foundkey === FALSE) ( foreach ($array as $anahtar => $değer) ( if (is_array($value) && count($value) > 0) ( $foundkey = search_in_array($srchvalue, $value); if ($foundkey != FALSE ) return $foundkey; ) ) değilse return $foundkey;

$a = ["x" => ["eee", "ccc"], "b" => ["zzz"]]; $bulundu = boş; $arama = "eee"; array_walk($a, function ($k, $v) use ($search, &$found) ( if (in_array($search, $k)) ( $found = $v; ) )); var_dump($bulundu);

İşte aynı şey için bir satır,

$pic_square = $userdb["pic_square"];

İşte benim örneğim ve lütfen bunun benim ilk cevabım olduğunu unutmayın. Param dizisini çıkardım çünkü yalnızca belirli bir diziyi aramam gerekiyordu, ancak siz kolayca bir tane ekleyebilirsiniz. Aslında kullanıcı kimliğinden daha fazlasını aramak istedim.

Ayrıca benim durumumda, benzersiz olmayabilecek diğer alanlara göre arama sonucunda döndürülecek birden fazla anahtar olabilir.

/** * @param array çok boyutlu * @param string aranacak değer, yani name_first gibi belirli bir alan adı * @param string ilişkisel anahtar, yani field_name * * @return dizi tuşları. */ function search_revisions($dataArray, $search_value, $key_to_search) ( // Bu fonksiyon, aradığınız ilişkisel anahtarla ilgili belirli bir değerin // revizyonlarını arayacaktır. $keys = array(); foreach ($dataArray as $key => $cur_value) ( ​​if ($cur_value[$key_to_search] == $search_value) ( ​​$keys = $key; )) return $keys;

Daha sonra bunu farklı bir değer ve ilişkisel anahtar aramama izin vermek için yazdım. Dolayısıyla ilk örneğim, herhangi bir belirli ilişkisel anahtardaki bir değeri aramanıza ve tüm eşleşmeleri döndürmenize olanak tanır.

Bu ikinci örnek, değerin ("Taylor") belirli bir ilişkilendirme anahtarında (ad_adı) nerede bulunduğunu gösterir. VE başka bir ilişkisel anahtarda (kullanılan) başka bir değer (doğru) bulunur ve tüm eşleşmeleri döndürür ("Taylor" VE adlı kişilerin kullanıldığı anahtarlar).

/** * @param array çok boyutlu * @param string $arama_değeri Aranacak değer, yani belirli bir "Taylor" * @param string $key_to_search Bulunacak ilişkisel anahtar, yani ilk_isim * @param string $other_matching_key İlişkisel kullanılan eşleşmelerde bulunacak anahtar * @param string $other_matching_value Eşleşen ilişkisel anahtarda bulunacak değer, yani true * * @return dizisi anahtarları, yani kullanılan "Taylor" ilk adına sahip tüm kişiler. */ function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) ( // Bu işlev, aradığınız ilişkisel anahtarla ilgili belirli bir değer // için revizyonları arayacaktır. $ anahtarlar = dizi(); foreach ($dataArray as $anahtar => $cur_value) ( ​​if ($cur_value[$key_to_search] == $search_value) ( ​​if (isset($other_matching_key) && isset($other_matching_value) ) ( if ( $cur_value[$other_matching_key] == $other_matching_value) ( ​​$keys = $anahtar; ) ) else ( // Bazı aramalarda birden fazla // eşleşme olabileceğini, diğerlerinde ise olmayacağını unutmamalıyım, dolayısıyla devam etmeden açık bırakın $anahtarlar = $anahtar )) return $anahtarlar;

Fonksiyonun kullanılması

$veri = array(array("cust_group" => 6, "price" => 13,21, "price_qty" => 5), array("cust_group" => 8, "price" => 15,25, "price_qty" => 4), array("cust_group" => 8, "price" => 12,75, "price_qty" => 10)); $findKey = search_revisions($veri,"8", "cust_group", "10", "price_qty"); print_r($findKey);

Sonuç

Dizi ( => 2)

/** * basit ve çok boyutlu bir diziyi arar * @param type $needle * @param type $samanlık * @return boolean */ public static function in_array_multi($iğne, $samanlık)( $iğne = trim($iğne ); if(!is_array($samanlık)) return False; foreach($samanlık as $anahtar=>$değer)( if(is_array($değer))( if(self::in_array_multi($iğne, $değer)) return True; else self::in_array_multi($iğne, $değer) else if(trim($değer) === trim($iğne))(//visibility fix// error_log("$value === $ iğne görünürlüğü 1 gizli olarak ayarlanıyor"); return True; )) return False; )

Eğer (PHP 5>=5.5.0) kullanıyorsanız bunun için kendi fonksiyonunuzu yazmanıza gerek yok, sadece bu satırı yazmanız yeterli olacaktır.

Yalnızca bir sonuç istiyorsanız:

$anahtar = array_search(40489, array_column($userdb, "uid"));

Çoklu sonuçlar için

$anahtarlar = array_keys(array_column($userdb, "uid"), 40489);

Yorumlarda belirtildiği gibi bir ilişkisel diziniz varsa, bunu şununla yapabilirsiniz:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, "uid")),40489);

PHP kullanıyorsanız<5.5.0, вы можете использовать этот backport , спасибо ramsey!

Güncelleme. Bazı basit testler yapıyorum ve çoklu sonuç formu en hızlısı gibi görünüyor, hatta Jakub'un özel işlevinden bile daha hızlı!

PHP'nin sonraki sürümlerinde (>=5.5.0) bu tek satırı kullanabilirsiniz:

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

@ Mayhem'in yarattığı işlevi genişleten bu örnek, ('nin yalnızca bir kısmını eşleştirmek istiyorsanız, daha çok "belirsiz" bir arama olacaktır. büyük bölüm) arama dizeleri:

Function searchArrayKeyVal($sKey, $id, $array) ( foreach ($array as $key => $val) ( if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) ! == false) ( return $anahtar; )) return false )

Örneğin dizideki değer New York'a Hoş Geldiniz! ve sadece "New York!" kitabının ilk kopyasına ihtiyacınız var.

Dizideki tüm öğeleri bulan un işlevini kullanmak zorunda kaldım. Bu yüzden Jakub Truneček'in gerçekleştirdiği işlevi şu şekilde değiştirdim:

Function search_in_array_r($iğne, $dizi) ( $bulundu = dizi(); foreach ($array as $anahtar => $değer) ( if ($val == $iğne) ( array_Push($bulundu, $val); ) ) if (count($bulundu) != 0) return $found; else return null;

$arama1 = "demo"; $arama2 = "bob"; $arr = array("0" => "merhaba", "1" => "test", "2" => "john", "3" => array("0" => "martin", "1 " => "bob"),"4" => "demo"); foreach ($dizi as $değer) ( if (is_array($değer)) ( if (in_array($arama2, $değer)) ( echo "başarıyla"; //kodunuzu çalıştırın) ) else ( if ($değer) == $arama1) ( echo "başarılı"; )) ))

Mümkünse parametre türlerini girin. Ancak yalnızca int, bool ve float gibi basit türlerle çalışır.

$güvensiz_değişken = $_POST["kullanıcı_kimliği"]; $safe_variable = (int)$unsafe_variable ; mysqli_query($bağlantı, "Tablo (sütun) DEĞERLERİNE EKLEYİN ("" . $safe_variable . "")");

Bir dizide değer aramak, verilerle çalışan hemen hemen her PHP uygulamasında ve komut dosyasında gereklidir ve bunun için birçok yöntem ve özel işlev vardır. Göreve ve arama türüne bağlı olarak, özelliklerini, yürütme hızını ve kullanım kolaylığını dikkate alarak belirli araçları kullanmalısınız. Daha sonra, bir dizideki öğeleri aramak için PHP işlevleri, olası yapılar ve yöntemler hakkında bilgi sahibi olacağız ve ayrıca hangi yöntemin en hızlı olduğunu bulacağız.

Bir dizide arama yapma işlevleri:
dizi_araması- dizideki bir değeri aramak için kullanılır. Başarılı olursa aranan değerin anahtarını döndürür; hiçbir şey bulunamazsa FALSE değerini döndürür. PHP 4.2.0'dan önce array_search() işlevi başarısızlık durumunda FALSE yerine NULL değerini döndürüyordu.

Karışık dizi_arama fonksiyonunun sözdizimi (karışık iğne, samanlık dizisi [, bool katı]).

foreach ($değer olarak dizi_ifadesi)
ifade
foreach (array_expression as $anahtar => $değer)
ifade

Başarı durumunda TRUE değerini döndüren bir dizi öğesini aramak için foreach yapısıyla bir işlevin kullanılmasına bir örnek

İnşaat sözdizimi
süre (ifade)
ifade

Başarı durumunda bir dizi öğesinin anahtarını döndürür

Ölçüm tablosundan fonksiyonun olduğu görülebilir. dizi_araması, hem küçük hem de büyük dizilerde arama yaparken en iyi sonuçları gösterir. Aynı zamanda döngüler kullanılarak arama süresi dizinin boyutuna bağlı olarak önemli ölçüde artar.

Dizilerle çalışırken ana işlemlerden biri belirli bir değeri aramaktır. PHP array_search() işlevi bunun için tasarlanmıştır. Hem tek boyutlu hem de ilişkisel koleksiyonları işleyebilir, dizide bulunursa aranan değerin anahtarını döndürebilir.

Sözdizimi

PHP'deki array_search() fonksiyonunun resmileştirilmiş açıklaması aşağıdaki gibidir:

Karışık dizi_araması (karışık değer, dizi $koleksiyon [, bool katı])

Giriş parametreleri:

  • $collection - aramanın gerçekleştirileceği dizi;
  • değer - herhangi bir türün istenen değeri;
  • strict, katı bir türe duyarlı karşılaştırma mekanizması belirleyen isteğe bağlı bir boole bayrağıdır.

Çalışma mekanizması

PHP array_search() işlevi, değeri koleksiyon dizisindeki tüm değerlerle tek tek karşılaştırır. Varsayılan olarak karşılaştırma, işlenenlerin türlerine bakılmaksızın gerçekleştirilir. Bu ayar, katı bayrağın TRUE olarak ayarlanmasıyla değiştirilebilir. Dize karşılaştırmaları büyük/küçük harfe duyarlıdır.

Bir eşleşme bulunursa, bulunan öğeye karşılık gelen anahtar döndürülür ve işlevin çalışması durdurulur. Bu nedenle, bir dizide istenen değerin birden çok oluşumunu tespit etmek için kullanılamaz.

Hiçbir eşleşme bulunamazsa, işlev FALSE boolean değerini döndürür.

Döndürülen sonucu katı eşitlik operatörünü (===) kullanarak kontrol etmelisiniz. Bu önemlidir çünkü işlev, 0 veya boş dize gibi FALSE değerine dönüştürülen bir değer döndürebilir.

Kullanma örnekleri

Örnek 1. Çok boyutlu bir diziyi PHP array_search() işlevine aktarırken, çalışmanın sonucu aranan öğenin anahtarı olacaktır.

"kış", "sezon2" => "ilkbahar", "sezon3" => "yaz", "sezon4" => "sonbahar"); $sonuç1 = array_search("kış", $dizi); $sonuç2 = array_search("yaz", $dizi); $sonuç3 = array_search("nisan", $dizi); ?>

Bu örnekte, $result1 "sezon1" olarak ayarlanacak, $result2 "sezon3" olarak ayarlanacak ve $result3 boole değeri FALSE olarak ayarlanacak çünkü "april" dizesi kaynak dizide görünmüyor.

Örnek 2. PHP array_search() işlevi, anahtarlarını aşağıdaki sayısal indeksler olarak dikkate alarak tek boyutlu bir diziyi de işleyebilir.

$result değişkeni, $dizisindeki "hunter" öğesinin indeksine göre 1'e ayarlanacaktır.

Örnek 3. Sonucu analiz ederken olası hata.

"Washington", 1 => "Adamlar", 2 => "Jefferson", 3 => "Madison", 4 => "Monroe"); $sonuç = array_search("Washington", $başkanlar); if (!$result) ( echo "G. Washington ABD'nin ilk başkanı değildi"; ) ?>

Yani sonucu katı bir eşitlikle kontrol etmeden, George Washington'un Amerika Birleşik Devletleri'nin ilk başkanı olmadığına dair beklenmedik bir mesaj alabilirsiniz.

Örnek 4: Yalnızca bulunan ilk eşleşmenin anahtarı döndürülür.

Aradığınız değer dizide üç kez geçse bile, işlev yalnızca bulunan ilk sonucu döndürür - 0. Birden fazla eşleşme bulmak için PHP array_keys() işlevinin kullanılması önerilir.

(PHP 4 >= 4.0.5, PHP 5)

array_search -- Bir dizide belirli bir değeri arar ve başarılı olursa karşılık gelen anahtarı döndürür

Tanım

karışık dizi_araması(karışık iğne, dizi samanlık [, bool katı])

İğne değeri için samanlıkta arar ve dizide mevcutsa anahtarı döndürür, YANLIŞ aksi takdirde.

Yorum:İğne bir dize ise, büyük/küçük harfe duyarlı bir karşılaştırma gerçekleştirilir.

Yorum: PHP 4.2.0'a kadar, dizi_arama() başarısız olursa iade edilir HÜKÜMSÜZ yerine YANLIŞ .

Eğer değeri iletirseniz DOĞRU strict öğesine isteğe bağlı üçüncü bir parametre olarak işlev dizi_arama() samanlık dizisindeki iğne tipini de kontrol edecektir.

Samanlıkta birden fazla iğne bulunması halinde, bulunan ilk anahtar iade edilir. Bulunan tüm değerlerin anahtarlarını döndürmek için işlevi kullanın. dizi_anahtarları() isteğe bağlı bir arama_değeri parametresiyle.


Örnek 1: Kullanım örneği dizi_arama()

$array = array(0 => "mavi" , 1 => "kırmızı" , 2 => 0x000000 , 3 => "yeşil" , 4 => "kırmızı" );$key = array_search ("kırmızı", $dizi); // $anahtar = 1;
$anahtar = array_search("yeşil", $dizi); // $anahtar = 2; (0x000000 == 0 == "yeşil")
$anahtar = dizi_arama ("yeşil", $dizi, doğru); // $anahtar = 3;
?>
Dikkat

Bu işlev bir boole değeri olarak dönebilir YANLIŞ, dönüştürülen Boolean olmayan bir değer YANLIŞörneğin 0 veya "". Daha fazla bilgi için Boole türü bölümüne bakın. Bu işlevin döndürdüğü değeri kontrol etmek için === operatörünü kullanın.

Fok
Konunun devamı:
Android

Bu makaleyle bir dizi açıyorum - Sosyal CRM çalışmalarının bir açıklaması, yani. sosyal ağlarda kullanıcı ilgisiyle çalışmayı amaçlayan yazılım ürünleri. Diğer CRM'ler gibi...