Sıralama PHP kullanarak dize arama sorgusu pozisyonu ile MySQL arama sonuçları

5 Cevap php

I want my search results to be in order of string position from smallest to greatest. For example, searching for "banana" returns:


Babyfood, erik, muz ve pirinç, gergin

Muz, susuz, ya da muz toz

Muz, çiğ

Ekmek, muz, tarifi hazırlanan, margarin ile yapılan

Campbell Soup Şirketi, V8 SIÇRAMA Suyu İçecek, Çilek Muz

Campbell Soup Şirketi, V8 SIÇRAMA Smoothies, Çilek Muz

Campbell Soup Şirketi, V8 V. FUSION suları, Çilek Muz


I want "Muz, çiğ" to come first because "banana" is the first word in the result, and I want "CAMPBELL Soup..." to come up last because "banana" is the last word.

Ben () konumunu bulmak için strpos kullanabilirsiniz biliyorum, ama nasıl hep birlikte koymak?

5 Cevap

MySQL kolayca yapabilirsiniz.


 SELECT  title,LOCATE('banana',title)
 FROM myTable   
 WHERE  LOCATE('banana',title) > 0
 ORDER BY LOCATE('banana',title) 

başlık MySql tablo sütununu temsil eder.

Bu içerecektir gereksiz kompleks usort ya da örneğin, sorguda bunu yapmak için PHP benzer bir şey, iyi:

SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index

Ayrıca INSTR(titles, 'banana') as firstIndex ve bu değerin, ASC tarafından sipariş seçebilirsiniz. Bu Samanlıktakı iğnenin birinci konumdaki indeksin indeks döndürür. LIKE '%banana%' ve ayarlanmış olmalıdır olmayan bir şey çıkarırsa bir WHERE Maddesine Etiket:

SELECT id, pubdate, title, INSTR(title, 'tea') as `index`
FROM article
WHERE title LIKE '%tea%'
ORDER BY `index` ASC;

Bir SQL sorgusu bu verileri alamıyorsanız, sıralamak ki usort and stripos kullanarak; böyle bir şey yapmanız gerekir:

$arr = array(
    "Babyfood, plums, bananas and rice, strained", 
    "Bananas, dehydrated, or banana powder", 
    "Bananas, raw", 
    "Bread, banana, prepared from recipe, made with margarine", 
    "CAMPBELL Soup Company, V8 SPLASH Juice Drinks, Strawberry Banana", 
    "CAMPBELL Soup Company, V8 SPLASH Smoothies, Strawberry Banana", 
    "CAMPBELL Soup Company, V8 V. FUSION Juices, Strawberry Banana", 
);

function compare_position($a, $b) {
    return stripos($a, 'banana') - stripos($b, 'banana');
}

usort($arr, 'compare_position');
var_dump($arr);

Eğer parametre olarak aldığı iki dizeleri "Banana" konumunu (vaka-Insentive) karşılaştırır tanımlı bir fonksiyon sahibi yani burada sıralama vardır.


And you'll get this kind of output for your array, once sorted :

$ /usr/local/php-5.3/bin/php temp.php
array(7) {
  [0]=>
  string(37) "Bananas, dehydrated, or banana powder"
  [1]=>
  string(12) "Bananas, raw"
  [2]=>
  string(56) "Bread, banana, prepared from recipe, made with margarine"
  [3]=>
  string(43) "Babyfood, plums, bananas and rice, strained"
  [4]=>
  string(61) "CAMPBELL Soup Company, V8 SPLASH Smoothies, Strawberry Banana"
  [5]=>
  string(61) "CAMPBELL Soup Company, V8 V. FUSION Juices, Strawberry Banana"
  [6]=>
  string(64) "CAMPBELL Soup Company, V8 SPLASH Juice Drinks, Strawberry Banana"
}


Of course, if you get that data from an SQL query, it might be easier to do some additionnal calculations on the SQL side...

Sadece strpos taklit etmek isterseniz:

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)