v2.5.2
Giriş yap

Arrayları echo dönüştürme

erdal42
334 defa görüntülendi ve 1 kişi tarafından değerlendirildi
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 ?

Cevap yaz
Cevaplar (28)
ebykdrms
571 gün önce
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>";
erdal42
571 gün önce

Desteğin ve emeğin için çok teşekkür ederim hocam. Böyle hocalar, iyiki varsınız :)

erdal42
571 gün önce

Sanırım öyle. Evet. Div ile çizgi koymak istemiştim açıkcası :)

ebykdrms
571 gün önce

2 sözcük çıkarsa zaten ayrılıyor olmalı. Onu düşünerek yazdım.
İlk foreach'in ilk div'ine stil verebilirsiniz margin-top gibi.

erdal42
571 gün önce

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 ?

https://prnt.sc/bBoRtdPCmrd3

ebykdrms
571 gün önce
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>";
erdal42
571 gün önce

/**
 * @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 ?

erdal42
571 gün önce

https://prnt.sc/OhCF7_mk1HYu
Döndüremiyor hocam kodları. Çok ilginç. Yine aynı hata :(

ebykdrms
571 gün önce

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>";
erdal42
571 gün önce

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.

ebykdrms
571 gün önce
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.

erdal42
571 gün önce

Ayrıca yazı çıktıklarada div versem işim bitiyor.

erdal42
571 gün önce

Anlamlar kelime gibi onlara ayrı div vermek istiyorum.

ebykdrms
571 gün önce

Ş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?

erdal42
571 gün önce

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
571 gün önce

Doğrudan kapsayıcı bir div içine alabilirsiniz.
Örn 2.kodu kullanıyorsanız:
echo $kelimeler; yerine echo "<div>$kelimeler</div>"; yazarsınız.

erdal42
571 gün önce

Son olarak hocam. Dediğim gibi ikinci kod çalışıyor. Bunlara div verebilmek için örnek kodunuz var mı ? Ayrıca TDK'da olmayan veri yazılınca çıkmayacak şekilde değil mi ?

erdal42
571 gün önce

Hocam şöyle,
ikinci attığınız çalıştı. Bunlara div verebilmek için ne yapabiliriz ?

Kusuruma bakmayın. Yeni öğreniyorum. Ama sizlerin verdiği bilgi ile çok tecrübe ettim sizlerin sayesinde.

erdal42
571 gün önce

@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ı :(

ebykdrms
571 gün önce

Hata kodlarını görebilmek için sayfanın üstünde bir yere şunları yazmayı deneyebilirsiniz:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Önceki mesajımı düzenledim. Noktalı virgül hatası olabilir...

erdal42
571 gün önce

500 error hatasi verdi. işleme alamıyor. :(

erdal42
571 gün önce

Çok teşekkür ederim hocam.

Bu echoları
'if (count($h)) {

}'

arasına koyuyoruz değil mi ?

ebykdrms
571 gün önce
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.

erdal42
571 gün önce

Sizlerden haber bekliyorum :) Yeniden teşekkür ederim.

erdal42
572 gün önce

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

ebykdrms
572 gün önce

print_r($h); komutunuzun çıktısı nedir?

erdal42
572 gün önce

+

erdal42
572 gün önce

+