Estağfurullah sorun değil :) Kolay gelsin
Hocam Array yazan yerleri kaldıramazsın ki, o php foknsiyonunun geri döndürdüğü değerin ekrana yansıtılmış hâli. Yani biz TDK dan gelen veriyi bir fonksiyon sayesinde manipüle edip kendimiz bir veri döndürdük. Bu dönen veriyi de senin yeniden işlemen lazım. Bu fonksiyondan dönen değeri döngüye sok, bir html içerisine bu kodları dök. Html içerisine php yazmayı biliyorsundur. Ekranın nasıl görüneceğine sen karar vereceksin.
Bir sonuç yoksa da fonksiyondan dönen değerin boş mu dolu olduğuna göre html i oluştur veya oluşturma
$h = TDKSozluk(htmlspecialchars($_GET['q'] ?? 'hissikablelvuku'), 2, 1, 5);
if (count($h)) {
// Burada ekranını şekillendir
}
else {
// Demek ki bir sonuç dönmemiş. Zaten get yöntemi ile sonuçları aldığına göre sayfanı bu şekilde oluşturabilirsin. Asıl güzel olanı aramayı ajax ile yapıp öyle sonuçları göstermen olur
}
Keşke çalışsaydı benim yöntemle o kadar umutlu idim :) ekstra sortable a gerek kalmayacaktı. Aslında bütün data elimde olsa yaparım da siz nasıl istiyorsanız öyle yapın :)
Şimdi hatırladığım kadarıyla $(row).attr('id', 'data-'+dataid);
burada data-id şeklinde verilmesinin sebebi sortable ın data- dan sonraki id kısmını otomatik olarak yakalaması idi. Ona göre mevcut sırasını anahtar => değer şeklinde sunucuya gönderiyordu.
Benim yaptığım mantık hepsini döngüye sokma şeklinde idi
foreach($_POST as $k => $v) {
$update = $db->prepare("UPDATE table SET order = ? WHERE id = ?");
$update->execute([$k, $v]);
}
Normal koşullarda olması gerek gibi, nasıl bir şekilde çağırıyorsunuz acaba
TDKSozluk(htmlspecialchars($_GET['q']), 2, 1, 5);
böyle yapınca olmuyor mu ki?
Ben yine de opsiyonlu bir şeyler hazırladım :) Gelen kelimeye, anlama ve benzer kelimelere istediğiniz gibi limit koyabilirsiniz
<?php
/**
* @param $kelime
* @return string
* - PHP de sadece baş harfini büyük yapan Türkçe uyumlu fonksiyon olmadığı için kendimiz yazdık
*/
function mb_ucfirst($kelime): string
{
return mb_strtoupper(mb_substr($kelime,0, 1)) . mb_substr($kelime, 1);
}
/**
* @param string $kelime - Aranacak olan kelime
* @param string|false $kelimeLimit - Aranacak kelimenin kaç tane eş sesli anlamının döneceğini belirten parametre. false verilirse limit olmaz
* @param int $anlamLimit - Kelimenin en fazla kaç anlamı geri dönsün
* @param int $benzerLimit - Benzer kelimelerden en fazla kaç tane dönsün
* @return array
*/
function TDKSozluk(string $kelime, $kelimeLimit = false, int $anlamLimit = 2, int $benzerLimit = 10): array
{
$ch = curl_init("https://sozluk.gov.tr/gts?ara=$kelime");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
]);
$sonuc = curl_exec($ch);
curl_close($ch);
$sonuc = json_decode($sonuc,true);
$return = [];
for ($i = 0; $i <= count($sonuc); $i++) { // En fazla kaç tane kelime anlamı dönsün limiti. Yani eş anlamlı kaç kelime görünsün. Verdiğim hak örneği, hâk ve ikinci sırada bulunan hak kelimesini döndürür varsayılan 2 ile
if ($kelimeLimit !== false) {if ($i == $kelimeLimit) break; }
if (isset($sonuc[$i])) {
$madde = mb_ucfirst($sonuc[$i]['madde']);
$return[$sonuc[$i]['kac']]['kelime'] = $madde;
for ($j = 0; $j < count($sonuc[$i]['anlamlarListe']); $j++) {
if ($j == $anlamLimit) break;
if (isset($sonuc[$i]['anlamlarListe'][$j])) {
$return[$sonuc[$i]['kac']]['anlamlar'][$j] = [
'anlam' => $sonuc[$i]['anlamlarListe'][$j]['anlam'],
'ozellik' => $sonuc[$i]['anlamlarListe'][$j]['ozelliklerListe'][0]['tam_adi'] ?? null // Sadece ilk sıradaki özelliğin değeri
];
}
}
$birlesikler = $sonuc[$i]['birlesikler'];
if (strlen($birlesikler)) {
$explode = explode(', ', $birlesikler);
$return[$sonuc[$i]['kac']]['birlesikler'] = array_slice($explode, 0, $benzerLimit); // Birleşik kelimelerden en fazla kaç tane geri dönsün
}
}
}
return $return;
}
$h = TDKSozluk('hak', 2, 1, 5);
print_r($h);
Bu sözlük meselesinde zamanında çok uğraşmıştım, mesele veriyi almak değil de onu tüm ayrıntılarıyla işlemek. Biraz mükemmeliyetçi olmaya çalışınca gerçekten öyle oluyor :)
Mesela elma gibi basit kelimelerde işiniz kolay, API dan gelen veri tek bir indis içeriyor. Ama hak
gibi bir kelimeden 4 farklı kelime dönüyor. Sizin kod yapınızla arayan kişi yalnızca anlamı toprak olan hâk
kelimesini görecek. Maksimum 3 sözlük verisinden kastınız dönen bu değerlerin sınırı mı? Öyle bile olsa yine eksiklik oluşacak :)
Örneğin yine gelen kelimenin bir anlam sınırlaması olacak mı, örneğin çıkmak
kelimesinin tam 56 farklı anlamı var. Bu kadar anlamı alt alta sıraladığınızda sözlük için sitede ayırdığınız kısım için görsel bir sorun oluşturacak mı?
Siz tam olarak hangi verileri işlemek istediğinizi biraz daha detaylı açıklayın, onları php ile işlemek işin en kolay kısmı :) Kıstas olarak hak
kelimesini kullanabilirsiniz.
Link
Sadece bu göründüğü şekliyle var ve kendi içerisinde bir bütün,özelleştirmesi epeyi bir zaman alır. Bu durumda autocomplete için size bütün kelime listesini gönderebilirim. Sorunuza yardım için de bilgisayara geçince bakacağım.