Uzay php bulunan bir dize takas

5 Cevap php

Ben aşağıdaki işlevleri uygulamak gerekir:

Ben adını ve soyadını hem de içeren bir isim alanı var. Bu bir veritabanında saklanır ve sipariş 'soyadı adı' halindedir.

Ben bu kayıtları arar bir komut uygulama duyuyorum. Şu anda, ben bir boşluk varsa bunu örneğin bir isim değil, bir Kimlik Kartı Numarası anlamına gelir dize, bir boşluk olup olmadığını kontrol başardı. İşte kod:

$query = "John Doe";

$checkIfSpaceExists = strpos($query, " ");

if ($checkIfSpaceExists == "")
{
    //No Space therefore it is not a name
}
else
{
    //Contains space
   $queryExploded = explode(" ", $query);
   foreach ($queryExploded as $q)
   {
      //Here I need the functionality so that if someone entered John Doe
      //2 different strings are saved, which are
      //$string1 = John Doe
      //$string2 = Doe Johns

      //If the name consists of 3 parts, strings for every combination is saved
}

Sonra GİBİ özniteliği ile bir SQL deyimi bu dizeleri eklemek ve JOHN DOE ve DOE JOHN hem de GİBİ olacaktır. Bu nedenle, kullanıcı ya da sonucu bulmak için John Doe ya Doe John girebilirsiniz eğer.

Bunun nasıl herhangi bir öneriniz?

Çok teşekkürler

chris

5 Cevap

Tamam, baştan - dikkatlice the manual okumak emin olun. strpos bunu yaptığını düşünüyorum tam olarak ne yapmaz. Burada bir boşluk için kontrol etmelisiniz nasıl:

if (strpos($query, ' ') === false)  // the triple-equals is important!

Bundan sonra, sadece permutations and combinations meselesi. İşte bunu yapmak için nasıl gösterir yığın taşması başka bir cevap var: algorithm that will take number or words and find all possible combinations

Ne kombine VE-ayrı GİBİ-kısıtlamalar bu patladı 3 dizeleri kullanmaya ne dersiniz?

Gibi bir şey

"... WHERE name LIKE '%$name[0]%' AND name LIKE '%$name[1]%' AND name LIKE '%$name[2]%'"

Bir foreach döngü içinde bu dize inşa olabilir.

echo preg_replace('/^(\w+) (\w+)$/', '$2 $1', "John Doe");

Doe John

Ben isim ve soyadı içine bu alanı bölünmüş olamaz sanırım? Ben, veritabanında etiketleri yeni tablo oluşturma öneririz. Sonra record_id ve tag_id ile bir bağlantı record_tags yapmak ..., soyadı olabilir isim olabilir, kimlik numarası olabilir - Etiketler herhangi bir kelime olacak. Sonra sorgu gibi görünecek

SELECT record.* FROM record
INNER JOIN record_tags rt1 ON rt1.record_id = record.id
INNER JOIN tag t1 ON t1.id = rt1.tag_id
INNER JOIN record_tags rt2 ON rt2.record_id = record.id
INNER JOIN tag t2 ON t2.id = rt2.tag_id
WHERE
t1.name = "John"
AND t2.name = "Doe"

Eğer o kelime / etiketleri herhangi bir miktarda kullanmak gibi bu arama için daha iyi bir yaklaşım olacaktır. Ben SQL daha da kolay olabilir düşünüyorum. çoklu-benzeri bir yaklaşım ben veritabanı büyüdükçe, özellikle much daha yavaş düşünüyorum.

Bazı döngü ve dize manipülasyon, ben bu senaryoyu uygulamak için başardı.

İşte ben ne yaptım:

Sorgu strpos kullanarak bir boşluk varsa kontrol ettim. Bir boşluk içeriyorsa, o yüzden çıkış için 'isim soyadı' ve 'soyadı name' ile diğer dize ile bir dize için bir döngü girin ad ve soyadı hem de onun bir isim anlamına gelir

İşte kod:

   $like = ""; //This is the LIKE sql command.
   foreach ($selectedFields as $field)
   {
            $checkIfSpaceExists = strpos($query," ");

	if ($checkIfSpaceExists != "")
	{
		$query1 = $query; //No space, so query1 is equal ta original query

		$queryExploded = explode(" ", $query);

		for ($i=0; $i<count($queryExploded); $i++) //First loop (name surname)
		{
			$tmp1 = $tmp1 . " " . $queryExploded[$i];
		}

		for ($i=count($queryExploded); $i>=0; $i--) //Second loop (surname name)
		{
			$tmp2 = $tmp2 . " " . $queryExploded[$i];

		}
		$query2 = $tmp2;
		$query2 = trim($query2);

		$like = $like . $field . " LIKE '%" . $query1 . "%' or " . $field . " LIKE '%" . $query2 . "%' or ";

Ben bu ihtiyacı başkası yardımcı olur umarım :)