lostyazilim
tr.link

foreach döngüsü

8 Mesajlar 1.268 Okunma
acebozum
tr.link

bydoqt0r bydoqt0r WM Aracı Kullanıcı
  • Üyelik 08.12.2013
  • Yaş/Cinsiyet 28 / E
  • Meslek Yazılım
  • Konum İstanbul Anadolu
  • Ad Soyad B** S**
  • Mesajlar 30
  • Beğeniler 6 / 3
  • Ticaret 0, (%0)
S.a hocalar,

a değişkeni
[0] => Array
(
[id] => 20486
[surveyId] => 1430
[questionId] => 106972
[answer] => 1
[value] => 1
[comment] => -
[imagePath] => -
[photoList] =>
)

[1] => Array
(
[id] => 20487
[surveyId] => 1430
[questionId] => 106973
[answer] => 2
[value] => 1
[comment] => -
[imagePath] => -
[photoList] =>
)

b değişkeni

[0] => Array
(
[id] => 106972
[SurveyTypeCode] => 5
[SurveyDescription] => Anket
[SurveySectionNumber] => 1
)

[1] => Array
(
[id] => 106973
[SurveyTypeCode] => 5
[SurveyDescription] => Anket
SurveySectionNumber] => 1
)

[2] => Array
(
[id] => 106935
[SurveyTypeCode] => 5
[SurveyDescription] => Anket
[SurveySectionNumber] => 4
)

Şimdi iki tane dizim var elimde. a dizideki questionId ile b dizindeki id'yi eşleştirmeye çalışıyorum foreachle iç içe verileri yazdırmaya çalışıyorum. İf ile eşleşen verileri print_r ile b dizinin ekrana yazdır diyorum yazdırıyor eşleşenle. Eşleşmeyen yanı boşta kalan dizini else ile çalıştırmaya çalışıyorum, 3 veride geliyor. Burada bir hatam var ama nasıl çözemedim yardımlarınız için şimdiden teşekkür ederim.
 

 

elektronikssl
webimgo

101222 101222 WM Aracı Anonim Üyelik
  • Üyelik 22.01.2019
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 257
  • Beğeniler 68 / 43
  • Ticaret 0, (%0)
Şimdi sizin sorununuz ne tam olarak anlamadım biraz daha açıklayıcı olurmusunuz eger ekranda eşleşmeyen veriyi gostermek istemiyorsaniz else kismini bos birakin ve dizinin çıktısını yazmak yerine yazdığınız kodu paylaşın daha hızlı çözüm bulabilmek için
GunduzT

kişi bu mesajı beğendi.

berkaykrx berkaykrx WM Aracı Kullanıcı
  • Üyelik 14.09.2015
  • Yaş/Cinsiyet 28 / E
  • Meslek PHP Developer
  • Konum Ankara
  • Ad Soyad İ** K**
  • Mesajlar 974
  • Beğeniler 269 / 229
  • Ticaret 17, (%100)
Veritabanından çekmiyor musun verileri?
 

 

berkaycatak berkaycatak Kendi Çapında Geliştirici Kullanıcı
  • Üyelik 15.09.2014
  • Yaş/Cinsiyet 23 / E
  • Meslek Yazılımcı
  • Konum İstanbul Anadolu
  • Ad Soyad B** Ç**
  • Mesajlar 1242
  • Beğeniler 1278 / 406
  • Ticaret 9, (%100)
Veritabanından çekerken eşleştirirseniz eğer bu kadar sıkıntı yaşamazsınız. Buyrun sorgusu. Bunu kullanın halledersiniz.

SELECT’in yanına a.SurveyId‘de olduğu gibi çekmek istediğiniz bütün sütun isimlerini girmelisiniz.

SELECT a.id as aId, a.SurveyId...... b.id as bId ..... , FROM tablo1 a, tablo2 b WHERE a.questionId = b.id
 

 

wmaraci
wmaraci

bydoqt0r bydoqt0r WM Aracı Kullanıcı
  • Üyelik 08.12.2013
  • Yaş/Cinsiyet 28 / E
  • Meslek Yazılım
  • Konum İstanbul Anadolu
  • Ad Soyad B** S**
  • Mesajlar 30
  • Beğeniler 6 / 3
  • Ticaret 0, (%0)
hocam veritabanından çekmiyor. api sisteminden çekiyorum şimdi.
bir tane soru değişkenimiz var bu json veri olarak geliyor birde cevap değişenimiz var.
bunlar bir dizi olarak geliyor. bu dizinileri parçalıyorum iç içe foreachle.


hocam kod aşağıdaki gibi sadece küçük bir mantık hatası var

foreach($sorular_json as $sorularKey => $sorularVal){
foreach($soru_cevaplari_js as $soruCevapKey => $soruCevapVal){
if($soruCevapVal["questionId"] == $sorularVal["id"]){
echo "
";
print_r($soruCevapVal);
print_r($sorularVal);
echo "
";
}else($soruCevapVal["questionId"] != $sorularVal["id"]){
echo "
";
print_r($sorularVal);
echo "
";
// burada hepsini getiriyor ben sadece istediğim şey if ile eşleşeni getir else eşleşmeyenleri
// eşleşmeyenleri getiriyor ama hepsini getiriyor
}
}
}
 

 

AhmetKarabulut AhmetKarabulut WM Aracı Kullanıcı
  • Üyelik 11.09.2013
  • Yaş/Cinsiyet 30 / E
  • Meslek Bilgisayar Mühendisi
  • Konum İzmir
  • Ad Soyad A** K**
  • Mesajlar 1077
  • Beğeniler 361 / 361
  • Ticaret 33, (%100)
Sorgunuz;

foreach($sorular_json as $sorularKey => $sorularVal){
foreach($soru_cevaplari_js as $soruCevapKey => $soruCevapVal){
if($soruCevapVal["questionId"] == $sorularVal["id"]){
echo "
";
print_r($soruCevapVal);
print_r($sorularVal);
echo "
";
}else($soruCevapVal["questionId"] != $sorularVal["id"]){
echo "
";
print_r($sorularVal);
echo "
";
// burada hepsini getiriyor ben sadece istediğim şey if ile eşleşeni getir else eşleşmeyenleri
// eşleşmeyenleri getiriyor ama hepsini getiriyor
}
}
}


Hocam sorunun kaynağı şu;
2 adet iç içe foreach'iniz var. 1. foreach sorular için soru adedi sayısı kadar dönüyor(örneğin 3 sorunuz olsun)

1. foreach ilk soru için döngünün içine girdiğinde 2. foreach'iniz çalışıyor, orada da 2 cevabınız olduğunu varsayalım ve ilk soruyla ilk cevap arrayleri aynı olsun. Bu durumda if koşuluna girip soru ve cevabı eşleşip listeliyor. Ama bu noktada 2. foreach henüz döngüsünü tamamlamadığı için, 2. cevap için karşılaştırmayı yapıyor. Burada 2. cevap için yaptığında 1. soruyla 2. cevap eşit olmadığı için else koşuluna giriyor ve bu sefer else içindeki gösterimi yapıyor. Bu böyle üstteki for tüm değerleri için döngüsünü tamamlayana kadar devam ediyor. Haliyle istemediğiniz bir görüntü alıyorsunuz.

Burada çözüm şu olabilir. If içerisinde eşleşme olursa döngüyü break; yaparak kırarsanız, artık diğer cevaplar için bakmasına gerek kalmayacağını anlar. Ama bu yine sorunuzu çözmez çünkü 2. foreach içerisinde indexi 2 olan cevap eşleşecekse ilk ikisi için else koşuluna girip bu sefer eşleşmediğini varsayıp çalışmış olacak.

Benim size önerim şu olur; else kısmını döngünüzden kaldırın, ve if 'in içine en sona bir break koyarak boş yere 2. foreach'in çalışıp memory kullanmasına engel olun. Burada döngü break ile kırılmamış ve flag 1 set edilemeden sona ulaşmışsa eşleşmemiş olacağı için sorunuzu ekrana basın. Üstte anlattığım algoritmanın kod örneği;


foreach($sorular_json as $sorularKey => $sorularVal){
//eşleşme kontrolünü soru foreachinin her dönüşünün başında 0lıyoruz
$eslestiMi = 0;

foreach($soru_cevaplari_js as $soruCevapKey => $soruCevapVal){
if($soruCevapVal["questionId"] == $sorularVal["id"]){
echo "
";
print_r($soruCevapVal);
print_r($sorularVal);
echo "
";

//eşleşme olduğu için flag'e 1 set edip 2. foreach'i break ile kırıyoruz
$eslestiMi = 1
break;
}
}

//şayet eşleşme olmamışsa değişkenimiz 0 kaldığı için soruyu ekrana basıyoruz
if($eslestiMi == 0)
{
echo "
";
print_r($sorularVal);
echo "
";
}
}


Kodu çalıştırmadan direkt buradan yazdığım için unuttuğum syntax hataları olabilir ama mantık çalışacaktır.
VipTema bydoqt0r GunduzT

kişi bu mesajı beğendi.

bydoqt0r bydoqt0r WM Aracı Kullanıcı
  • Üyelik 08.12.2013
  • Yaş/Cinsiyet 28 / E
  • Meslek Yazılım
  • Konum İstanbul Anadolu
  • Ad Soyad B** S**
  • Mesajlar 30
  • Beğeniler 6 / 3
  • Ticaret 0, (%0)
AhmetKarabulut hocam,

Öncelikle çok çok teşekkür ederim. Ortalama 3 veya 5 gündür uğraştığım bir sorundu. Yazmış olduğunuz kodlara her hangi bir şekilde elimi sürmedim kopyala yapıştır yaptım. Direk çalıştırdım ve kod çalıştı.
Tebrik ederim hocam, hem açıklayıcı bir şekilde konuyu tamamladınız ve kodu gönderdiniz.
Sizlere ne kadar teşekkür etsem azdır.
 

 

GunduzT GunduzT WM Aracı Kullanıcı
  • Üyelik 29.01.2019
  • Yaş/Cinsiyet 38 / E
  • Meslek web tasarımı
  • Konum İstanbul Anadolu
  • Ad Soyad G** T**
  • Mesajlar 105
  • Beğeniler 104 / 46
  • Ticaret 0, (%0)
Bu aralar PHP öğrenmeye çalışıyorum.
üstteki örneği test etmeye çalıştım.

Kodu şu şekilde localime aldım

şu türden hatalar alıyorum.

Warning: Use of undefined constant id - assumed 'id' (this will throw an Error in a future version of PHP) in C:\WinNMP\WWW\** on line 5
Warning: Illegal offset type in C:\WinNMP\WWW\** on line 5
Warning: Use of undefined constant surveyId - assumed 'surveyId' (this will throw an Error in a future version of PHP) in C:\WinNMP\WWW\** on line 6

neyi yanlış yapmışım?


$sorular_json = [
[0] => Array(
[id] => 20486,
[surveyId] => 1430,
[questionId] => 106972,
[answer] => 1,
[value] => 1,
[comment] => "-",
[imagePath] => "-",
[photoList] => ""
),
[1] => Array(
[id] => 20487,
[surveyId] => 1430,
[questionId] => 106973,
[answer] => 2,
[value] => 1,
[comment] => "-",
[imagePath] => "-",
[photoList] => ""
),
];

$soru_cevaplari_js =
[
[0] => Array(
[id] => 106972,
[SurveyTypeCode] => 5,
[SurveyDescription] => Anket,
[SurveySectionNumber] => 1,
),

[1] => Array(
[id] => 106973,
[SurveyTypeCode] => 5,
[SurveyDescription] => Anket,
[SurveySectionNumber] => 1,
),

[2] => Array(
[id] => 106935,
[SurveyTypeCode] => 5,
[SurveyDescription] => Anket,
[SurveySectionNumber] => 4,
),
];


foreach ($sorular_json as $sorularKey => $sorularVal) {
//eşleşme kontrolünü soru foreachinin her dönüşünün başında 0 lıyoruz
$eslestiMi = 0;

foreach ($soru_cevaplari_js as $soruCevapKey => $soruCevapVal) {
if ($soruCevapVal["questionId"] == $sorularVal["id"]) {
echo "
";


print_r($soruCevapVal);
print_r($sorularVal);
echo "
";

//eşleşme olduğu için flag'e 1 set edip 2. foreach'i break ile kırıyoruz
$eslestiMi = 1;
break;
}
}

//şayet eşleşme olmamışsa değişkenimiz 0 kaldığı için soruyu ekrana basıyoruz
if ($eslestiMi == 0) {
echo "
";

print_r($sorularVal);
echo "
";
}
}
 

 

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al