2013-10-14 16 views
5

Eğer şöyle bir döngü içinde doldurulan herhangi dizi $ p varsa:php olarak ilişkisel dizinin değer indeksini bulunuz?

$p[] = array("id"=>$id, "Name"=>$name); 

Ne Ad anahtarında John aramak için en hızlı yoludur ve bulursa, $ p dizin dönmek? $ P ile döngü yapmaktan başka bir yolu var mı?

$ p değerini bulmak için 5000 adede kadar sahibim ve $ p da potansiyel olarak 5000 satır içerebilir. Şu anda, her bir isim için $ p ile dönüyorum ve eğer bulunursa, onu ayrıştırın (ve başka bir diziye ekleyin), satırı $ p'dan ayırın ve 1'i kırın, sonra da 5000 ismin bir sonraki kısmını aramaya hazır olun.

Eğer indeksi elde etmek için daha hızlı bir yol varsa, $ p ile döngüden ziyade, örneğin bir isset tipi yoldan mı?

Bir göz attığınız için teşekkürler.

+0

başka şekilde değil. Dönmelisin.PHP dahili olarak değerler için herhangi bir hashmap ya da benzerliğini korumaz; sadece anahtarlar için. (Bu sayede, $ q [$ p [$ key]] = $ anahtar; ') – bwoebi

+0

OMG türünde ekstra büyük bir dizi yaratabilirsiniz. Bu nedenle büyük veriyi işlemek için veritabanı kullanamıyorsanız, başka bir şey olursa olsun –

+0

Tek yol, $ p cinsinden bir ismin her bir yerine, tüm isimleri ve bir indeksi (veya isimleri unqiue değilse indeksli dizileri) içeren başka bir ilişkisel dizi oluşturmaktır. – Tumtum

cevap

4

Bu sorunu görebildiğim gibi, benzersiz kimliğiniz var, ancak adlar benzersiz olmayabilir.

Sen olarak diziyi başlatmak olabilir:

array($id=>$name); 

Ve sevdiği aramalar olabilir: Bu olacak samanlıkta iğne bulmak yerli yöntemi olarak çok iyi çalışacaktır

array_search($name,$arr); 

Kendi uygulamanızdan daha iyi bir uygulama.

örn. Bu yöntemde

$id = 2; 
$name= 'Sunny'; 
$arr = array($id=>$name); 
echo array_search($name,$arr); 

yankıları 2

önemli bir avantajı kod okunabilirliği olurdu.

+1

Teşekkürler çocuklar! Kodla bir oyun oynayacağım ve hangi çözümün en uygun olduğunu göreceğim. – Shaun

+1

array_search() işi yapıyor! Teşekkürler Sunny! – Shaun

1

Aynı istek içinde bu tür aramaların çoğunu gerçekleştirmeniz gerekeceğini biliyorsanız, bunlardan bir dizin dizisi oluşturabilirsiniz. Bu, oluşturduğunuz dizinin her dizini bir kere dizisine geçirecektir. Yalnızca sayfa başına bir veya iki arama yapmak gerekirse

$piName = array(); 
foreach ($p as $k=>$v) 
{ 
    $piName[$v['Name']] = $k; 
} 

sonra harici veritabanına dizi hareketli ve orada endeksi oluşturmayı düşünün.

+0

İlk girdiyi bulmak için iyi görünüyor olsa da (tabii ki karşılık gelen anahtar olacak) - aynı diziye sahip birden çok girdiyi tutması gerekiyorsa OP'nin isteğini yerine getirecektir 'Name' alanı –

+0

* Son olarak * Aslında, OP'nin mevcut algoritmasından (ki bu ilkini bulur) farklıdır. –

+0

Ah, evet, anladım. Benim amacım - eğer kaynak dizisini bu şekilde yeniden yapılandırırsak, açıkçası, bu birden fazla değeri kaybetmenin bir nedeni olabilir. Yani bu yapı orijinalden _instead_ kullanılamaz, ancak _with_ kullanılabilir. –

0
$index = 0; 
$search_for = 'John'; 
$result = array_reduce($p, function($r, $v) use (&$index, $search_for) { 
    if($v['Name'] == $search_for) { 
    $r[] = $index; 
    } 
    ++$index; 
    return $r; 
}); 

$ sonuç anahtar Name ile öğe değerini John vardı $ p elemanların tüm indisleri içerecektir.


Düzenleme (. Bu tabii ki sadece 0 ile başlayan sayısal endeksli ve endeksinde hayır “delik” vardır bir dizi için çalışır): Muhtemelen daha kolay sadece array_filter kullanmak, ama bu döndürmez sadece endeksleri, ama NameJohn eşittir tüm dizi öğesi - ama endeksleri korunacaktır:

, daha iyi mi sorumlu uygun ihtiyaçları nelerdir
$result2 = array_filter($p, function($elem) { 
    return $elem["Name"] == "John" ? true : false; 
}); 
var_dump($result2); 

. hangisi daha hızlıdır, anlamanız sizin için.