PHP fonksiyon değeri dönmüyor

4 Cevap php

I have a function which, given a filename and directory path, checks if the directory already contains a file with the same name and if so returns an amended filename (by appending a number after the first part of the filename). (The get_filenames() function is a CodeIgniter helper function which creates an array of all the filenames in the specified directory.)

Ben işlev çağrısı döndürülen sonucu yazdırmak çalıştığınızda, ben bir şey olsun; Ben else fonksiyonunun kendisi {} deyimi $ new_filename yazdırmak ama eğer, o zaman sadece (daha doğrusu değer baskı daha) işlevini çağırın, bu işe yarıyor!

Ben aslında daha fazla işlem için bir değişkene atamak için ihtiyaç olarak yazdırın, fonksiyonu değerini değil dönmek gerekir. (Aşağıdaki örnekte ben sadece noktayı göstermek için işlev çağrısının sonucu basılı ettik.)

Fonksiyonu:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count)
{   
    $num = '';
    if ($count > 0):
    	$num = $count;
    endif;

    $filename_arr = explode('.', $old_filename, -1);
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];

    if (in_array($new_filename, get_filenames($dir))):		
    	$count++;
    	avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
    else:
    	return $new_filename;
    endif;
}

Ve ben işlevini çağırır burada:

print avoid_conflicting_filenames('file.jpg', '', 'path/to/file', 0);

Bu son gün için beni deli olmuştur, bu yüzden herhangi bir yardım büyük mutluluk duyacağız! Teşekkürler.

4 Cevap

Bu değiştirin:

avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);

Bu grubu:

return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);

Özyinelemeli düşünmeye değil. Sen işlevin dönüş değeri dönmek zorunda.

Sözdizimi eğer ile geçmiş, ne oldu? Ben şablonlar içine tahammül, ancak kodu? ew.

Ben doğru kodu anlama ediyorum, siz de bu yüzden gibi özyineleme önlemek için bu işlevi yazabilirsiniz:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir) {   
    $num = 0;
    $files = get_filenames($dir);
    $filename_arr = explode('.', $old_filename, -1);
    do {
        $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];
        $num++;
    } while(in_array($new_filename, $files));
    return $new_filename;
}

Ben bu güzel ve almak için biraz daha kolay olduğunu düşünüyorum, ama o size kalmış ...

Kodunuzu değiştirin:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count)
{   
    $num = '';
    if ($count > 0):
        $num = $count;
    endif;

    $filename_arr = explode('.', $old_filename, -1);
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];

    if (in_array($new_filename, get_filenames($dir))):          
        $count++;
        return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
    else:
        return $new_filename;
    endif;
}

Avoid_conflicting_filenames içinde avoid_conflicting_filenames ararken dönüş statment unutulmuş.

Özyinelemeli işlevi koşuyoruz. Sen işlevinin "üst" örneği için geçmesi sonucunu gerekir:

if (in_array($new_filename, get_filenames($dir))):          
    $count++;
    // Note "return" statement below.
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
else:
    return $new_filename;
endif;

Sizin ikinci ilk şubesini alınırsa eğer fonksiyon return ifadesi karşılaştığında asla.

Okumak için değiştirin:

if (in_array($new_filename, get_filenames($dir))):          
    $count++;
    //Added return
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
else:
    return $new_filename;
endif;