Arrayları echo dönüştürme
function mb_ucfirst($kelime): string
{
return mb_strtoupper(mb_substr($kelime,0, 1)) . mb_substr($kelime, 1);
}
function TDKSozluk(string $kelime, $kelimeLimit = true, 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 !== true) {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(htmlspecialchars($_GET['q']), 2, 1, 5);
print_r($h);
if (count($h)) {
}
else {
}
Merhabalar, Abdullah hocam sayesinde kodum hazır. TDK'dan veri çekiyoruz. Bunu nasıl if ile echo yani, düzenleyip veriyi işleyebiliriz ?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (28)
echo "<div class='kelimeler'>";
foreach($h as $item) {
echo "<div class='kelimeKapsayici'>";
$kelime = $item["kelime"];
echo " <div class='kelime'>";
echo " <div>Kelime:</div>";
echo " <div>$kelime</div>";
echo " </div>";
echo " <div class='anlamlar'>";
echo " <div>Anlamlar</div>";
if(isset($item["anlamlar"]) && is_array($item["anlamlar"])) {
foreach($item["anlamlar"] as $anlam) {
$anlamStr = $anlam["anlam"];
$ozellik = $anlam["ozellik"];
echo "<div class='anlam'>";
echo " <div>";
echo " <div>Özellik:</div>";
echo " <div>$ozellik</div>";
echo " </div>";
echo " <div>";
echo " <div>Anlam:</div>";
echo " <div>$anlamStr</div>";
echo " </div>";
echo "</div>";
};
}
else echo "<div>Anlam bulunamadı</div>";
echo "</div>";
echo "<div class='birlesikler'>";
if(isset($item["birlesikler"]) && is_array($item["birlesikler"])) {
foreach($item["birlesikler"] as $birlesik) {
echo "<div>$birlesik</div>";
};
}
else echo "<div>Birleşikler bulunamadı</div>";
echo "</div>";
echo "</div>";
echo "<hr />";
};
echo "</div>";
Oldu hocam. Çok teşekkürler :)
Son olarak iki tane sözlük çıkabilir. Eğer çıkarsa ikinci sözlüğün birinci sözlük ile div şekilde nasıl ayırabiliriz ?
echo "<div class='kelimeler'>";
foreach($h as $item) {
echo "<div class='kelimeKapsayici'>";
$kelime = $item["kelime"];
echo " <div class='kelime'>";
echo " <div>Kelime:</div>";
echo " <div>$kelime</div>";
echo " </div>";
echo " <div class='anlamlar'>";
echo " <div>Anlamlar</div>";
if(isset($item["anlamlar"]) && is_array($item["anlamlar"])) {
foreach($item["anlamlar"] as $anlam) {
$anlamStr = $anlam["anlam"];
$ozellik = $anlam["ozellik"];
echo "<div class='anlam'>";
echo " <div>";
echo " <div>Özellik:</div>";
echo " <div>$ozellik</div>";
echo " </div>";
echo " <div>";
echo " <div>Anlam:</div>";
echo " <div>$anlamStr</div>";
echo " </div>";
echo "</div>";
};
}
else echo "<div>Anlam bulunamadı</div>";
echo "</div>";
echo "<div class='birlesikler'>";
if(isset($item["birlesikler"]) && is_array($item["birlesikler"])) {
foreach($item["birlesikler"] as $birlesik) {
echo "<div>$birlesik</div>";
};
}
else echo "<div>Birleşikler bulunamadı</div>";
echo "</div>";
echo "</div>";
};
echo "</div>";
/**
* @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(htmlspecialchars($_GET['q'] ?? 'hissikablelvuku'), 2, 1, 5);
if (count($h)) {
function div($content) { return "<div>$content</div>"; }
function section($content) { return "<section>$content</section>"; }
function strong($content) { return "<strong>$content</strong>"; }
function span($content) { return "<span>$content</span>"; }
function i($content) { return "<i>$content</i>"; }
function ul($content) { return "<ul>$content</ul>"; }
function li($content) { return "<li>$content</li>"; }
$kelimeler = "";
$anlamlar = "";
$birlesikler = "";
echo "<div class='kelimeler'>";
foreach($h as $item) {
echo "<div class='kelimeKapsayici'>";
$kelime = $item["kelime"];
echo " <div class='kelime'>";
echo " <div>Kelime:</div>";
echo " <div>$kelime</div>";
echo " </div>";
echo " <div class='anlamlar'>";
echo " <div>Anlamlar</div>";
foreach($item["anlamlar"] as $anlam) {
$anlamStr = $anlam["anlam"];
$ozellik = $anlam["ozellik"];
echo "<div class='anlam'>";
echo " <div>";
echo " <div>Özellik:</div>";
echo " <div>$ozellik</div>";
echo " </div>";
echo " <div>";
echo " <div>Anlam:</div>";
echo " <div>$anlamStr</div>";
echo " </div>";
echo "</div>";
};
echo "</div>";
echo "<div class='birlesikler'>";
foreach($item["birlesikler"] as $birlesik) {
echo "<div>$birlesik</div>";
};
echo "</div>";
echo "</div>";
};
echo "</div>";
}
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
}
Çalıştı hocam. Ancak anlam vs bir kısım çalışmadı gibi.
link : https://prnt.sc/4QSeJAXxj-AR
Bir yerde hata yapmışmıyız hocam ?
https://prnt.sc/OhCF7_mk1HYu
Döndüremiyor hocam kodları. Çok ilginç. Yine aynı hata :(
Her şeyi div'e çevirdim.
echo "<div class='kelimeler'>";
foreach($h as $item) {
echo "<div class='kelimeKapsayici'>";
$kelime = $item["kelime"];
echo " <div class='kelime'>";
echo " <div>Kelime:</div>";
echo " <div>$kelime</div>";
echo " </div>";
echo " <div class='anlamlar'>";
echo " <div>Anlamlar</div>";
foreach($item["anlamlar"] as $anlam) {
$anlamStr = $anlam["anlam"];
$ozellik = $anlam["ozellik"];
echo "<div class='anlam'>";
echo " <div>";
echo " <div>Özellik:</div>";
echo " <div>$ozellik</div>";
echo " </div>";
echo " <div>";
echo " <div>Anlam:</div>";
echo " <div>$anlamStr</div>";
echo " </div>";
echo "</div>";
};
echo "</div>";
echo "<div class='birlesikler'>";
foreach($item["birlesikler"] as $birlesik) {
echo "<div>$birlesik</div>";
};
echo "</div>";
echo "</div>";
};
echo "</div>";
Yok hocam, olmuyor. Şaka gibi. Hep echo sistemli olsa idi işimi rahatlatırdı. Sizi çok rahatsız ettim ama. Beni bağışlayın.
En son attığınız kodu denedim ve yine 500 http hatasına yönlendirdi.
Kelime,anlamlar,birleşik,özellik gibi yazılara div verebilsem benim için yeterli olacak. Yani anlam yazısına başka div çıkacak olan veri yazısına da ayrı bir div vermek istemiştim.
foreach($item["anlamlar"] as $anlam) {
$anlamArr = explode(" ", $anlam["anlam"]);
for($i=0; $i<count($anlamArr); $i++) $anlamArr[$i] = div($anlamArr[$i]);
$anlamlar .= li(i("Özellik: ".$anlam["ozellik"]).div(implode("",$anlamArr)));
};
belki böyle olabilir bu foreach'i değiştirirseniz.
Anlamlarda geçen cümleyi boşluk karakterlerinden ayırıp her birini bir div içine alacak.
Şu an şöyle bir yapı oluşuyor olmalı:
<div>
<div>
<strong>Kelime: </strong>
<span>kelime</span>
</div>
<section>
<div>
<div><strong>Anlamlar</strong></div>
<ul>
<li><i>(Özellik: özellik)</i><span>anlam metni...</span></li>
<li><i>(Özellik: özellik)</i><span>anlam metni...</span></li>
</ul>
</div>
<div>
<div><strong>Birleşikler</strong></div>
<ul>
<li><span>birleşik kelime</span></li>
<li><span>birleşik kelime</span></li>
</ul>
</div>
</section>
</div>
Siz nasıl bir yapı istiyorsunuz?
Evet hocam, oldu. Son olarak bu kodlara nasıl div verebiliriz. Verince hata veriyor. Düzeltmeye çalışınca yine aynı. Yani sadece kelimelere verince tüm içindeki kelime anlam vs etkin oluyor. Ayrı ayrı div vermem gerekiyor. Son kaldı sadece :)
$anlamlar .= li(i($anlam["ozellik"]).span($anlam["anlam"]));
};
foreach($item["birlesikler"] as $birlesik) {
$birlesikler .= li(span($birlesik));
};
$kelimeler .= div(
div(strong("Kelime: ").span($item["Kelime"]))
.section(div(strong("Anlamlar")).ul($anlamlar))
.section(div(strong("Birleşikler")).ul($birlesikler))
@ebykdrms
keşke hataları görebilsem hocam. Ancak
500 error döngüsüne giriyor.
https://prnt.sc/2tHq-wys4-jd
Son düzenlemeleri geri düzenledim. Yine aynı :(
function div($content) { return "<div>$content</div>"; }
function section($content) { return "<section>$content</section>"; }
function strong($content) { return "<strong>$content</strong>"; }
function span($content) { return "<span>$content</span>"; }
function i($content) { return "<i>$content</i>"; }
function ul($content) { return "<ul>$content</ul>"; }
function li($content) { return "<li>$content</li>"; }
$kelimeler = "";
$anlamlar = "";
$birlesikler = "";
foreach($h as $item) {
foreach($item["anlamlar"] as $anlam) {
$anlamlar .= li(i($anlam["ozellik"]).div($anlam["anlam"]));
};
foreach($item["birlesikler"] as $birlesik) {
$birlesikler .= li(span($birlesik));
};
$kelimeler .= div(
div(strong("Kelime: ").span($item["kelime"]))
.section(div(strong("Anlamlar")).ul($anlamlar))
.section(div(strong("Birleşikler")).ul($birlesikler))
);
};
echo $kelimeler;
Kodları test etme imkânım yok şu an. Varsayımsal olarak yazdım.
Hata veriyorsa sunucuda hata gösterimini açmalısınız yoksa hatayı göremeyiz.
Kodları if(count($h)) {...}
içine alabilirsiniz.
Başka yerde olduğum için bakamadım. Ancak bu tarzda çıkıyor. Aynı. Benimkinede birleşik yanyana çıkıyor boşluksuz.
Buyurun : https://prnt.sc/GKWbamgP6AC1