• PHP: array_search - hızlı dizi arama. PHP: array_search - Rus dilinde anahtarlar ve değerlerle hızlı dizi arama

    Programlama, sözdizimi ve anlambilim ile ilgilidir. İlki dilin kurallarına göre belirlenir, ikincisi ise geliştiricinin deneyimine göre belirlenir. Dizilerle ilgili olarak, geliştirici sözdizimini semantikle kurnazca yükleyebilir. Henüz bir nesne değil ama artık geleneksel anlamda bir dizi de değil. PHP, kendiniz de dahil olmak üzere çeşitli türlerdeki değişkenlerden diziler oluşturmanıza izin verir. Bir dizi öğesi bir işlev, yani diziyi gerçek bir algoritma, gerçek anlam yükleme yeteneği olabilir.

    Sözdizimi kararlıdır, ancak sürümden sürüme değişir ve aşağıdan yukarıya 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ünde uygulanamaz; dilin kuralları tarafından bile sağlanmayan şeyleri ifade etmek için sözdizimsel yapıları kullanmak bir gelenek haline geldi. Diziler örneğini kullanarak, bu en basit şekilde anlaşılabilir.

    dizi yapısı

    PHP'de bir dizinin kullanışlı bir sözdizimi ve işlevi vardır. Bu önceden açıklanabilir, ancak gerektiğinde anında diziler oluşturmak genellikle uygundur.

    public $aNone = dizi(); // dizi tanımlanmış 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 = "ayrıştırılmış veri satırı";

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

    eğer (checkFunc($cSrcLine, $cUserLine) (

    $aSonuç = "Evet"; // PHP dizisine ekle

    $aSonuç = "Hayır";

    Bu örneğin yürütülmesi sonucunda, değerleri yalnızca "Evet" veya "Hayır" dizeleri olacak 13 öğelik bir dizi oluşturulacaktır. Öğeler 0'dan 12'ye dizine eklenecek. Aynı etki, önce "gelecek" PHP dizisini bir dizgeye yazarak da 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"; )

    $aSonuç = patlama("|", $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 uygulamayı zorlaştırır. Yazar "bir dizideki PHP dizisi" doktrinini anlasa bile, kötüye kullanılmamalıdır: yalnızca geliştiricinin karmaşık notasyona alışması gerekmeyecektir. Çoğu zaman, bir süre sonra, yaratıcının kendisi ilk başta ne yazdığını uzun süre hatırlayacaktır:

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

    "yönlendirici" => dizi("yollar" => dizi("sayhello" => dizi(

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

    "seçenekler" => dizi("rota" => "/sayhello", "varsayılanlar" => dizi(

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

    "denetleyiciler" => dizi("invokables" => dizi(

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

    Bu, ZF 2'nin PHP dizi içinde dizi örnek uygulamasıdır.İlk başta pek ilham verici değildir, ancak çalışır ve muhtemelen bu çerçeveyi başarılı kılar (örnek, ZendSkeletonApplication/module/Helloworld/config/module.config.php modülünden).

    Bir dizi, tasarım ve geliştirme sırasında önemli bir veri yapısıdır. Çok boyutlu varyantı bir zamanlar popülerdi, ancak zamanla maksimum iki veya üç boyutlu dizilere olan ihtiyaç devam etti. Bu şekilde daha kolay ve nettir ve profesyonellik açısından bir şeyler çoğalmaya başladığında bu, problem bildiriminde 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ırlandırmak en iyisidir. PHP kararlılığına ve güvenilirliğine rağmen, sözdizimsel yapıların işlenmesinde hatalar yapar. İyi bir kod düzenleyiciniz varsa buna katlanabilir ve parantezleri ve virgülleri doğru bir şekilde saymaya alışabilirsiniz. Bununla birlikte, PHP veri türlerini kontrol etmez (bu, modern programlamanın karmasıdır) ve geliştiricinin anlamsal hatalar yapmasına izin verir.

    Değişken türlerini kontrol etme kuralı veya kişinin anlambilimi sözdizimine dönüştürme konusundaki kendi fikirleri genellikle karşılanamaz bir lükstür. Bu, komut dosyası hızında, kod okunabilirliğinde bir kayıptır ... çünkü kodlamada basitlik her zaman önemlidir.

    PHP'nin önemli bir olumsuz özelliği vardır: Bir belirsizlik oluştuğunda, betik askıda kalır. Tüm hata ayıklayıcılar öngörülemeyen durumları ele almaz ve çoğu, geliştiricinin deneyimine ve sezgisine bağlıdır. Algoritma ne kadar basitse, bilgi ne kadar erişilebilir şekilde yapılandırılmışsa, bir hata bulma veya hiç yapmama olasılığı o kadar yüksektir.

    İlk diziler ortaya çıktığında, veri varyantlarının yapılar biçiminde önerilmesi karakteristiktir - çeşitli veri türlerinden bir şey yaratmaya yönelik beceriksiz bir girişim. İlki hayatta kaldı ve yeni bir verimli sözdizimi aldı, ikincisi tarihe geçti.

    Basit ve ilişkisel diziler

    İki boyutlu bir dizi girişi, başka bir "[" ve ​​"]" parantez çiftidir, örneğin: $aSrcData, $aSrcData dizisine dahil edilen dizinin bir öğesini ifade eder. PHP'de önceden veri bildirme zorunluluğu yoktur. Bildirilen herhangi bir bilginin varlığı her zaman kontrol edilebilir.

    Bir şeyi yalnızca ihtiyaç duyulduğunda, ihtiyaç duyulduğu biçimde yaratmak ve artık ihtiyaç duyulmadığında onu yok etmek çok verimlidir. Anlamlı adları anahtarlar (dizinler) olarak kullanarak, algoritmadaki geçerli yer bağlamında anlamlı olan okunabilir yapılar elde edebilirsiniz:

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

    $aAnketa["isim"] = "Petrov";
    $aAnketa["yaş"] = 34;
    $aAnketa["iş"] = "Yönetici";
    $aAnketa["etkin"] = doğru;
    $aTablo = $aAnketa;

    $aAnketa["isim"] = "Afanasiev";
    $aAnketa["yaş"] = 28;
    $aAnketa["work"] = "İşçi";
    $aAnketa["etkin"] = yanlış;
    $aTablo = $aAnketa;

    $sOne .= iç içe ("; ", $aTable) . "
    "; // ikinci PHP dizisini bir dizgeye dönüştürdük
    $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: "ad", "yaş", "iş", "etkin"):

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

    Bu basit örnekte, oluşturulan anketin tüm çalışanlara nasıl uygulanabileceğini görebilirsiniz. Personel numaralarına göre endeksli bir çalışan dizisi oluşturabilir ve belirli bir çalışana ihtiyaç duyulursa, onu personel numarasına göre seçebilirsiniz.

    Kuruluşun alt bölümleri varsa veya mevsimlik işçiler varsa veya çalışan emeklileri ayırmanız gerekiyorsa ... "dizi içinde PHP dizisi" yapısı çok uygundur, ancak boyuta asla kapılmamalısınız. Etkili bir çözüm için sınır iki veya üç boyuttur.

    Dizilerle çalışma tuşları

    Daha önce her şeyin nasıl çalıştığı önemliyse, o zaman ikili çağın son yıllarında, programcı dizinin öğelerinin tam olarak nasıl saklandığını bilmek istediğinde ve bunlara doğrudan erişmek istediğinde, bunlar tamamen unutuldu. Bellekte bir bayttan çok daha fazlasını kaplayan birçok karakter kodlaması ortaya çıktı. "Bit" kelimesi artık yalnızca bit arama işlemlerinde bulunabilir, ancak bir PHP dizisinde arama yapmak ayrı bir konudur. Öğelere erişim basit ve ilişkisel olabilir. İlk durumda, dizi öğeleri (PHP'de bulunan türlerden herhangi birine sahip olan) 0, 1, 2, ... olarak numaralandırılır. İkinci durumda, programcı, dizine erişmek için genellikle "anahtar" olarak adlandırılan kendi dizinini belirtir. istenen değer.

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

    veya (sayfanın ve kodun kodlamasına saygı duyarak 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 bir sonucu olarak:

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

    alacak:

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

    PHP-key dizisine "şeftali" ve "patlıcan" öğeleri eklenirken 0'dan sırayla oluşturulur ve değerini belirttiğinizde 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, döngünün yürütülmesi sonucunda, orijinal dizi taranır ve gereksiz öğelerin yazılmadığı yeni bir dizi oluşturulur.

    Daha kolay yapabilirsiniz. Son örneğe uygulanırsa:

    unset($satır); // elemanı PHP dizisinden kaldır

    o zaman sonuç şöyle olacaktır:

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

    Dizi öğelerini işlemek için birçok seçenek vardır. Örneğin, implode() ve patlatma() işlevlerini kullanarak, bir PHP dizisini bir sınırlayıcı içeren bir dizgeye yazabilir ve farklı bir sınırlayıcı kullanarak onu başka bir diziye geri ayrıştırabilirsiniz.

    PHP'deki tüm diziyi basitçe silmek için şunu yazmanız yeterlidir: unset($aLine);

    Yeter.

    Dizi Arama

    PHP özel arama ve in_array() işlevleri sağlar, ancak bunları kullanmaya karar vermeden önce kendi PHP dizi aramanızı yapmayı düşünmelisiniz.

    Herhangi bir proje, özellikle semantiğin bir kısmı sözdizimine aktarıldığında ve oldukça özel bir dizi anlamlı anahtarla temsil edildiğinde, belirli bir yapılandırılmış dizidir. Bu, anlamlı bir şekilde etiketlenebilen kendi arama işlevlerinizi gerçekleştirmenize olanak tanır.

    PHP'de, adı program yürütülürken belirlenen işlevleri çağırabilirsiniz. MS Word belgelerini okumanızı ve oluşturmanızı sağlayan PHPWord kitaplığından çok pratik bir örnek:

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

    $işlevler = dizi();

    için ($i = 0; $i< count($elements); $i++) {
    $işlevler[$i] = "ekle" . $öğeler[$i];
    }

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

    $elements üzerinde $functions işlevini çağırarak, mükemmel bir arama ve hızlı bir sonuç elde edebilirsiniz.

    Öğeleri sıralama

    Verileri sıralama görevi önemlidir ve PHP bunun için çeşitli işlevler sağlar: sort(), rsort(), asort(), ksort(), ... Artan ve azalan öğeler, ikinci iki işlev, tuşlar ve arasındaki ilişkiyi saklar ve değerler. 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ı bir türe sahip olamayacağını, aynı zamanda tamamen doğal içeriğe sahip olamayacağını unutmamak gerekir. Her şeyden önce, farklı formatlarda yazılmış sayıların yanı sıra, Rusça harfleri içeren dizeleri sıralama, tarihleri ​​​​sıralama konusunda çok dikkatli olmanız gerekir.

    En azından betiğin test aşamasında kendi mükemmel çözümünüzü yazmanın en iyi yolu, elle sıralama yapmaktır. Öngörülemeyen durumları tahmin etmeye yardımcı olacaktır.

    Dize dizileri

    implode() ve patlama() işlevleri sayesinde, bir dizi kolayca bir dizgeye dönüştürülebilir ve geri alınabilir. Bu, verileri kompakt bir görünümde saklamanıza ve gerektiğinde uygun bir duruma genişletmenize olanak tanır.

    Diziye dönüştürülen bir dizi, yeni olasılıklar açar. Örneğin, metinde anahtar kelime arama görevi, bulunanın tekrar eklenmemesini gerektirir.

    $cSrcLine = "Text Text ListItemRun TextBox ListItem TextBox Check Box CheckBox TextBox Dipnot";

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

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

    $cOne = iç içe("; ", $aDst);

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

    Anahtarlar ve değerlerde Rus dili

    Sözdizimsel yapılarda ulusal kodlamalarla ilgili herhangi bir şeyin kullanılması önerilmez. Karakterleri a'dan z'ye geçen diğer tüm diller gibi Rus dili de veri alanında sorun yaratmayacak, ancak kod sözdiziminde sorun yaratmayacaktır. Bazen basit bir PHP görevi olan "yazıcıya veya ekrana bir dizi çıktısı" bile "çökmelere" yol açar ve daha sıklıkla betiği durdurur.

    PHP sadık bir dildir ve ulusal kodlamalara toleranslıdır, ancak bir anahtar değerin doğru yerde ve doğru zamanda ortaya çıkması nedeniyle yapılan iş miktarının yeniden yapılması gereken birçok durum vardır, bu da tanınamaz.

    PHP Sözdizimi ve Dil Ortamı

    Unutulmamalıdır ki PHP sözdizimi bir şeydir, ancak bu sözdiziminin yapıları diğer uygulamalarla, işletim sistemiyle ve donanım seçenekleriyle "ilişki" gösterir. Birçok seçenek var, her şeyi öngörmek asla mümkün değil.

    “Kodda sadece kod vardır ve girişte, içeride ve çıkışta herhangi bir bilgi vardır” kuralı, öngörülemeyen sürprizlerden kaçınmaya yardımcı olacaktır. Dizideki PHP değeri "Rusça" olabilir, ancak bunun anahtarı yalnızca verilen dil açısından değil, aynı zamanda çevresi açısından da sözdizimsel olarak doğru olmalıdır.

    Bir dizide değer bulmak, birçok yolu ve özel işlevleri olan verilerle çalışan komut dosyası olan hemen hemen her PHP uygulamasında gereklidir. Göreve ve arama türüne bağlı olarak, özellikleri, yürütme hızı ve kullanım kolaylığı dikkate alınarak bir veya başka bir araç kullanılmalıdır. Ardından, bir dizideki öğeleri, olası yapıları ve yöntemleri bulmak için PHP işlevlerini tanıyacağız ve ayrıca hangi yöntemin en hızlı olduğunu bulacağız.

    Bir dizide arama işlevleri:
    dizi_arama— bir dizide değer aramaya hizmet eder. Başarılı olursa istenen değerin anahtarını, hiçbir şey bulunamazsa FALSE döndürür. PHP 4.2.0'dan önce, array_search() başarısızlık durumunda FALSE değil NULL döndürüyordu.

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

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

    Bir dizi öğesini bulmak için foreach yapısına sahip bir işlev kullanma örneği, başarı durumunda DOĞRU döndürür

    Yapı sözdizimi
    süre (ifade)
    ifade

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

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

    Dizilerle çalışırken yapılan temel işlemlerden biri belirli bir değer bulmaktır. PHP array_search() işlevi bunun içindir. Dizide bulunursa aranan değerin anahtarını döndürerek hem tek boyutlu hem de ilişkisel koleksiyonları işleme yeteneğine sahiptir.

    Sözdizimi

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

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

    Giriş parametreleri:

    • $koleksiyon - aranacak dizi;
    • değer - herhangi bir türden istenen değer;
    • katı, katı bir türe duyarlı karşılaştırma mekanizması ayarlayan isteğe bağlı bir boole bayrağıdır.

    Çalışma mekanizması

    PHP array_search() işlevi, değeri toplama dizisindeki tüm değerlerle sırayla karşılaştırır. Varsayılan olarak karşılaştırma, işlenenlerin türleri dikkate alınmadan gerçekleştirilir. Bu ayar, katı bayrağı TRUE olarak ayarlanarak değiştirilebilir. Dize karşılaştırması 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şlev sonlandırılır. Bu nedenle, dizide istenen değerin birden fazla oluşumunu algılamak için kullanılamaz.

    Eşleşme bulunamazsa, işlev FALSE boolean değerini döndürür.

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

    kullanım örnekleri

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

    "kış", "2. sezon" => "ilkbahar", "3. sezon" => "yaz", "4. sezon" => "sonbahar"); $result1 = array_search("kış", $dizi); $result2 = array_search("yaz", $dizi); $result3 = array_search("nisan", $dizi); ?>

    Bu örnekte, $result1, "sezon1" olarak, $result2, "sezon3" olarak ve $result3, orijinal dizide "nisan" dizesi bulunmadığından, FALSE boolean değerine ayarlanacaktır.

    Örnek 2. PHP array_search() işlevi, anahtarlarını sıradaki sayısal dizinler olarak dikkate alarak tek boyutlu bir diziyi de işleyebilir.

    $array içindeki "hunter" öğesinin dizinine göre $result değişkeni 1 olarak ayarlanır.

    Örnek 3. Sonucun analizinde olası hata.

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

    Bu nedenle, sonucu kesin 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.

    Aranan değer dizide üç kez geçse de işlev yalnızca bulunan ilk sonucu döndürür - 0. Birden çok eşleşme aramak için PHP array_keys() işlevinin kullanılması önerilir.

    çok boyutlu (18)

    Array_search işlevinin açıklamasının altındaki örneklerden birini değiştirdim. searchItemsByKey işlevi, çok boyutlu bir diziden (N düzey) $key ile tüm değerleri döndürür. Belki bu birine yardımcı olabilir. Örnek:

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

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

    fonksiyon kodu:

    function searchItemsByKey($array, $key) ( $results = array(); if (is_array($array)) ( if (isset($array[$key]) && key($array)==$key) $results = $array[$key]; foreach ($array as $sub_array) $results = array_merge($results, searchItemsByKey($sub_array, $key)); ) $sonuçları döndür; )

    Uid'yi aramak ve diziden anahtarı 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", "ad" => "Michael", "pic_square" => "urlof40489"));

    search_by_uid(100) (ilk kullanıcının uid'si) çağrısı 0 döndürmelidir.

    search_by_uid(40489) işlev çağrısı 2 döndürmelidir.

    Döngüler oluşturmayı denedim, ancak daha hızlı çalıştırılabilir koda ihtiyacım var.

    Jakub'ın mükemmel cevabına dayanarak, anahtarın belirtilmesine izin verecek daha genelleştirilmiş bir arama burada (yalnızca uid için değil):

    function searcharray($value, $key, $array) ( foreach ($array as $k => $val) ( if ($val[$key] == $value) ( ​​​​return $k; ) ) null döndürür ;)

    Kullanım: $results = searcharray("searchvalue", searchkey, $array);

    function searchForId($id, $array) ( foreach ($array as $key => $val) ( if ($val["uid"] === $id) ( $key; ) ) null döndürür; )

    Çalışacak. Bunu şöyle çağırmalısın:

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

    === kullanıyorsanız, karşılaştırılan işleç türlerinin tamamen aynı olması gerektiğini bilmek önemlidir, bu örnekte string aramanız veya === yerine sadece == kullanmanız gerekir.

    cevaba göre angoru. PHP'nin sonraki sürümlerinde (>= 5.5.0) tek satırlık kullanabilirsiniz.

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

    Bu eski bir soru olmasına ve kabul edilmiş bir cevap olmasına rağmen, kabul edilen cevapta bir değişiklik önereceğimi düşündüm. Her şeyden önce, 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) ( $key; ) ) false döndürür; )

    Bunun yerine, ön ayarlı "uid"yi işlevdeki bir parametreyle değiştirin, böylece aşağıdaki kodu çağırmak, aynı 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 = array (array("uid" => "100","name" => "Sandra Shush","url" => "urlof100"), array("uid" => " 5465","name" => "Stefanie Mcmohn","url" => "urlof100"), dizi ("uid" => "40489","name" => "Michael","url" => "urlof40489) "),); // Dizinin Anahtarını Elde Edin $arrayKey = searchArrayKeyVal("uid", "100", $userdb); if ($arrayKey!==false) ( echo "Arama Sonucu: ", $userdb[$arrayKey]["ad"]; ) else ( echo "Arama Sonucu bulunamadı"; )

    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) ( return ($returnKey ? $k: $val); ) )else( return (is_array($val) ? arraySearchMulti ($search,$key,$val,$returnKey) : null); ) ) null döndür; ))

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

    ="2""; $Dizi = dizi("a" => dizi("d" => "2"), dizi("a" => "Örnek Dünya","b" => "2"), dizi("c" => "3"), dizi("d" => "4")); $Sonuç = ArraySearch($Dizi,$sorgu,1); yankı "

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

    Eğer soru, yani

    $a = [ [ "_id" => "5a96933414d48831a41901f2", "discount_amount" => 3.29, "discount_id" => "5a92656a14d488570c2c44a2", ], [ "_id" => "5a9790fd14d48879cf16a9e 8", " indirim_miktarı" => 4.53, " indirim_id" => "5a9265b914d488548513b122", ], [ "_id" => "5a98083614d488191304b6c3", "indirim_miktarı" => 15.24, "indirim_id" => "5a92806a14d48858ff5c2ec3", ], [ "_id" => "5a982a4914d48824721eafe3", "indirim_amount " => 45,74, "indirim_id" => "5a928ce414d488609e73b443", ], [ "_id" => "5a982a4914d48824721eafe55", "indirim_amount" => 10.26, "indirim_id" => "5a928ce414d488609 e73b 443", ], ];

    function searchForId($id, $array) ( $did=0; $dia=0; foreach ($array as $key => $val) ( if ($val["discount_id"] === $id) ( $ dia +=$val["discount_amount"]; $did++; ) ) if($dia != "") ( echo $dia; var_dump($did); ) null döndür; ); 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 $key => $value) ( ​​if (is_array($value) && count($value) > 0) ( $foundkey = search_in_array($srchvalue, $value); if ($foundkey != FALSE) ) $foundkey'i döndür; ) ) ) yoksa $foundkey'i döndür; ) )

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

    İşte aynısı için bir astar,

    $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 onu kolayca ekleyebilirsiniz. Esasen sadece uid'den daha fazlasını aramak istedim.

    Ayrıca, benim durumumda, benzersiz olmayabilecek diğer alanlarla birlikte arama sonucunda döndürülecek birden çok anahtar olabilir.

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

    Daha sonra, farklı bir değer ve bir ilişkisel anahtar aramama izin vermek için bunu yazdım. Bu nedenle, ilk örneğim, herhangi bir ilişkisel anahtarda bir değer aramanıza ve tüm eşleşmeleri döndürmenize izin verir.

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

    /** * @param dizisi çok boyutlu * @param string $search_value Aranacak değer, yani belirli bir "Taylor" * @param string $key_to_search Onu bulmak için ilişkisel anahtar, yani ilk_ad * @param string $other_matching_key İlişkisel istihdam için eşleşmelerde bulunacak anahtar * @param string $other_matching_value Bu eşleşen ilişkisel anahtarda bulunacak değer, yani true * * @return dizisi anahtarları, yani ilk adı "Taylor" olan, istihdam edilen 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 $key => $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 = $key; ) ) else ( // Bazı aramaların birden çok // eşleşmesi olabileceğini ve diğerlerinin olmayacağını unutmamalıyım, yani devam etmeden açık bırakın .$keys = $key; ) ) ) return $keys; )

    fonksiyon kullanımı

    $data = array(array("cust_group" => 6, "price" => 13.21, "price_qty" => 5), array("cust_group" => 8, "price" => 15.25, "price_qty" => 4), dizi("müşteri_grubu" => 8, "fiyat" => 12,75, "fiyat_qty" => 10)); $findKey = search_revisions($data,"8", "cust_group", "10", "price_qty"); print_r($bulAnahtar);

    Sonuç

    dizi ( => 2)

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

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

    Tek bir sonuç istiyorsanız:

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

    Birden fazla sonuç için

    $keys = array_keys(dizi_sütun($userdb, "uid"), 40489);

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

    $keys = array_keys(dizi_kombin(dizi_keys($userdb), dizi_sütun($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, Jakub'ın özel işlevinden bile daha hızlı!

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

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

    @mayhem'in oluşturduğu işlevi genişleterek, yalnızca ( ile eşleştirmek istiyorsanız bu örnek daha çok "belirsiz" bir aramadı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) ( $key; ) ) false döndür )

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

    Dizideki tüm öğeleri bulan un işlevini kullanmak zorunda kaldım. Bu nedenle Jakub Trunechk tarafından gerçekleştirilen işlevi şu şekilde değiştirdim:

    function search_in_array_r($needle, $array) ( $found = array(); foreach ($array as $key => $val) ( if ($val == $needle) ( array_push($found, $val); ) ) if (count($found) != 0) $found döndürür; aksi takdirde null döndürür; )

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

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

    $unsafe_variable = $_POST["user_id"]; $safe_variable = (int)$güvenli_değişken ; mysqli_query($conn, "INSERT INTO tablo (sütun) DEĞERLER ("" . $safe_variable . "")");