v2.5.2
Giriş yap

for içerisinde if yada switch case kullanmak

rotaile
410 defa görüntülendi

arkadaşlar selam, sorunum for içerisinde ki for da olan x değerini $i değeri 3 yada 6 olduğu zaman x ve y değerlini değiştirmek. ama şöyle bir sorun oluyor $i değeri 3 olduğu zaman döngü devam etmiyor nedeni nedir? (aynı şekilde if ile de denedim yine aynı yerde takıldı döngü)

$mimeType = $request->file('sharedPhoto')->extension();
$img = Image::make('img/shared-photos/27-06-2022_17-09-31-faruk-savur.jpg');

$y = 0;
$x = 0;
for ($i = 1; $i <= 9; $i++) {
    for ($x; $x <= 400; $x += 200) {
        switch ($i) {
            case 3:
                $x = 0;
                $y = 200;
                break;
            case 6:
                $x = 0;
                $y = 400;
                break;
        }
        //print ("i: " . $i . "<br>");
        $img->crop(200, 200, $x, $y)->save('img/shared-photos/' . $i . '.' . $mimeType);
    }
}
ebykdrms
882 gün önce
// $i=1 ve $x=0 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
    for (0; 0 <= 400; $x += 200) {
        switch (1) { /* $i değeri 3 veya 6 olmadığı için switch koşulu sağlanmadı*/ }
        echo "i: 1<br>";
        $img->crop(200, 200, 0, 0)->save('img/shared-photos/1.jpg');
    }
}
// $i=1 ve $x=200 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
    for (200; 200 <= 400; $x += 200) {
        switch (1) { /* $i değeri 3 veya 6 olmadığı için switch koşulu sağlanmadı*/ }
        echo "i: 1<br>";
        $img->crop(200, 200, 200, 0)->save('img/shared-photos/1.jpg');
    }
}
// $i=1 ve $x=400 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
    for (400; 400 <= 400; $x += 200) {
        switch (1) { /* $i değeri 3 veya 6 olmadığı için switch koşulu sağlanmadı*/ }
        echo "i: 1<br>";
        $img->crop(200, 200, 400, 0)->save('img/shared-photos/1.jpg');
    }
}
// $i=1 ve $x=600 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
    for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}
// $i=2 ve $x=600 olduğu durum:
for ($i = 1; 2 <= 9; $i++) {
    for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}
// $i=3 ve $x=600 olduğu durum:
for ($i = 1; 3 <= 9; $i++) {
    for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}
// $i=4 ve $x=600 olduğu durum:
for ($i = 1; 4 <= 9; $i++) {
    for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}

Sorun şu ki;
$x değişkenine for içinde başlangıç değeri atamadığınız için her seferinde eski değerinden devam ediyor.
$x bir kez 400'ü geçtiğinde bir daha $x'i 0 yapacak bir komut satırına ulaşamıyor çünkü içteki döngü koşulu sağlanmadığı için switch sorgusuna ulaşılamıyor.

Aslında $i değeri 3 olduğunda döngü sonlanmıyor. $x değeri 600 olduğunda (yani içteki döngü 3 kez döndükten sonra) içteki döngünin koşulu sağlanmadığı için döngü geçersiz kalıyor.
Sizin bütün işlemleriniz de içteki döngüde olduğu için 3 kez çıktı elde edebilmiş oluyorsunuz.

Bu arada crop işlemi de aynı dosya adını birkaç kez kullanıyor. Yani içteki döngü ilk dönüşünde 1.jpg dosyası oluşuyor. İkinci dönüşünde yine 1.jpg dosyası oluşuyor. Üçüncü dönüşünde de yine 1.jpg dosyası oluşuyor. Tabi aynı dosya adı aynı klasörde olamayacağı için muhtemelen 2. ve 3. dönüşlerde 1.jpg dosyasının üzerine yazılyor.

Eğer içteki döngüde for($x=0; $x<=400; $x++) { şeklinde $x değerini sıfırlayamayacaksanız (kurgunuz buna uygun değilse) baştan kurgulamalısınız. Çünkü bu şekliyle döngüler sağlıklı çalışıyor olsaydı bile aynı dosyayı tekrar tekrar yazma sorununuz olacaktı.