v2.5.2
Giriş yap

PHP İç İçe Foreach Problemi

obey00
909 defa görüntülendi

Veritabanı tablomda iki adet Field var, birincisinde tüm taksit seçeneklerinin YÜZDE değerleri yer alıyor. Şu şekilde:

{"taksit_2":3.92,"taksit_3":4.91,"taksit_4":5.9,"taksit_5":6.88,"taksit_6":7.87,"taksit_7":8.86,"taksit_8":9.84,"taksit_9":10.83,"taksit_10":11.82,"taksit_11":12.8,"taksit_12":13.79}

İkinci tablomda ise; kullanıcının formda bu taksit oranlarının altındaki Text tipindeki INPUT'lara yazdıkları fiyatlar var. O da şu şekilde:

{"taksit_2":"1.00","taksit_3":"2.00","taksit_4":"3.00"}

Yani kullanıcıya ilk başta 2 taksitten 12 taksite kadar 11 adet INPUT gösteriyorum. Kullanıcı yukarıdaki örnekte gösterdiğim gibi mesela 3 adet INPUT'u dolduruyor ve bu şekilde kayıt ediyor. Tablodaki ikinci olan field'e kayıt oluyor burası...

Benim yapmak istediğim şey ise şu: Mesela kullanıcı yukarıdaki örnekte olduğu gibi "taksit_2, taksit_3, taksit_4" seçeneklerine değerler girdiyse; sayfa yenilendiği zaman hangi taksit oranlarına değer verdiyse (yani bu örnekte 3 tane taksit oranına değer girmiş) onların INPUT'larındaki Value'leri müşterinin kayıt ettiği VALUE'ler ile güncelleyeceğim; ayrıca yine o yerlerde birkaç kod parçası yazacağım...

Ancak iç içe foreach döngüsü yaptığım zaman; sadece SON/EN ALTTAKİ kayıt üzerinde işlem yapılıyor; diğerlerini atlıyor.

Örnek kod parçam:

foreach ((array)$cardRates as $key => $val) {
    foreach ((array)$arrAlts as $keyTaksit => $valAltTL) {
        if($keyTaksit == "taksit_{$cnt}") {
            $altTutarTL = $valAltTL;
            $altChecked = 'checked';
        } else {
            $altChecked = null;
    }
}

Yukarıdaki kod parçasını çalıştırdığım zaman; sadeceen son hangi kayıt yapıldıysa (örneğin taksit_3, taksit_6, taksit_11 değerlerine müşteri müdahale ettiyse; sadece taksit_11 için işlem yapıyor)

Umarım detaylı açıklayabilmişimdir.

Kıssadan hisse: Veritabanı tablomda 2 adet field mevcut; bunları JSON_DECODE ediyorum. İki tarafta'da KEY'ler aynı düzende kurulu olduğu için; AYNI/ORTAK olan KEY'ler üzerinde bir takım kodlar eklemem/müdahele etmem gerekiyor... Yardımcı olur musunuz?

Cevap yaz
Cevaplar (6)
obey00
954 gün önce

abdullahx; bayağı benzer bir senaryo sorulmuş gerçekten. cevabını deneme fırsatım olmadı; birkaç saat önce alternatif çözüm düşünürken FOREACH'ten önce farklı ayrı bir array oluşturup; müşterinin güncellediklerini bu array'e push etmek ve harici oluşturduğum bu array içerisinden if/else yardımı ile kod parçalarımı yazarak sorunu çözdüm. Yine de farklı yöntemler arayan arkadaşlar için de cevabın oldukça faydalı olacaktır diye düşünüyorum. Teşekkürler

abdullahx
954 gün önce

Ben bu soruya daha önce bir yerlerde yanıt vermiştim, hatta bunun için hazırladığım kodlar ve veri tabanı örneği bile duruyor hâlâ.
Aşağıda yazdığım kodlarda kullanıcının yazdığı değerler direkt olarak birinci fielddaki ana datayı güncelliyor.İkinci field a da kullanıcının en son kayıt ettiği veriler ekleniyor. Yani diyelim en son 5,6 ve 7 numaralı taksitleri yazıp kayıt ettiyse sadece taksit_5, takist_6 ve taksit_7 kaydoluyor.

index.php

<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<?php
try {
    $db = new PDO("mysql:host=localhost; dbname=test","root","");
    $db-> exec("SET NAMES utf8mb4; SET CHARSET utf8mb4");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Bağlanamadı'. $e->getMessage();
    $db = null;
}
$query = $db->query("SELECT * FROM t")->fetch(2);
$taksitler = json_decode($query['field_1'], true);
?>
<form action="ajax.php" method="post">
<?php
for ($i = 2; $i <= 12; $i++): ?>
    <label for="taksit_value_<?= $i ?>">Taksit <?= $i ?></label>
    <input id="taksit_value_<?= $i ?>" type="number" disabled value="<?= $taksitler['taksit_'.$i] ?>"> <br>
    <label for="taksit_input_<?= $i ?>">Taksit <?= $i ?> için değer giriniz</label>
    <input id="taksit_input_<?= $i ?>" type="number" name="taksit_<?= $i ?>" step="0.01"><br><br>
<?php endfor;
?>
    <input type="submit" value="Onayla">
</form>


</body>
</html>

ajax.php

if ($_POST) {
    $lastUpdate = [];
    foreach ($_POST as $key => $value) {
        if (!empty($value)) { // Yalnızca girilen değerleri güncellemek için
            $db->query("UPDATE t SET field_1 = JSON_REPLACE(field_1, '$.$key', $value) WHERE id = 1"); // Buradaki id değerini dinamik yapabilirsiniz
            $lastUpdate[$key] = $value;
            // Diğer kodlarınızı da burada yazablirsiniz
        }
    }
    if (count($lastUpdate)) {
        $update = json_encode($lastUpdate);
        $query = $db->prepare("UPDATE t SET field_2 = ? WHERE id = 1");
        $query->execute([$update]);
    }
}
rephp7
955 gün önce

ilk foreach den sonra
if(is_array($değişkeniniyaz)) {

Kontrol için is_array() fonksiyonu kullanır mısın? Dizi ise true değilse false döner. Eğer değişkenin array ise ikinci foreach döngüsü ile dizinin içerisindeki elemanları da ekrana yazdırırsın.

obey00
955 gün önce

Şimdi düzenledim, umuyorum daha okunaklı & anlaşılır olmuştur.

rephp7
955 gün önce

yorum cümlelerinizi kod işareti içinden çıkartın. Bu şekil kimse kodlarınızdan bir şey anlamaz.

hakankorkz
955 gün önce

hocam bu nasıl yapı hiç bir şey anlayamadım soruyu acaba revize mi? etseniz anlaşılırlığı pek yok bence..