Printf () deyimi kullanılmaktadır kaç argüman bulun

3 Cevap php

Bazı bilinmeyen girişi önüne alındığında, nasıl, hangi değişkenlerin bir (s)printf deyimi yerine ikame ediliyor söyleyebilirim?

printf("%s %s", "a", "b");     // both used
printf("%s",    "a", "b");     // only the first one used
printf('%1$s %1$s', "a", "b"); //      "        "
printf('%s %1$s', "a", "b");    //     "        "
printf('%1$s %s %1$s', "a", "b");   // "        "
printf('%2$s', "a", "b");      // only the second one used.

Aynı değere sahip olabilir, çünkü birinci ve ikinci değişken varlığı için elde edilen dizi kontrol, yardımcı olmayacaktır.

Kendi durum, orada ikame edilebilir sadece hiç 2 değişken ve ben ikinci bir kullanılmış olup olmadığını bilmek gerekir.

3 Cevap

İşte bunu yapmak için biraz hackish fonksiyonudur:

function printf_and_return_min_args_required(/* var args */) {
    $old_track = ini_set('track_errors', '1');
    $args = func_get_args();
    $args2 = array();
    $required = 100;	
    foreach ($args as $arg) {
    	$args2[] = $arg;
    	if (@call_user_func_array("printf", $args2)) {
    		$required = count($args2) - 1;
    		break;
    	}
    }
    ini_set('track_errors', $old_track);
    return $required;
}

Eğer $result fonksiyonu tarafından basılan istemiyorsanız sprintf() yerine array($result, $required) geri dönmek zorunda kalabilirsiniz için.

Biçim dize kendinizi ayrıştırmak ve beklediği kaç args bakın.

EDIT: Bir psuedocode örneği (hiç hata denetimi):

bool arg1used = false;
bool arg2used = false;
int unspecifiedscount = 0;
for (int i = 0; i < s.length; i++) {
    if s[i] != '%' continue;
    switch s[i+1] {
        case '%':
            i++;
            break;
        case 's':
            if unspecifiedscount == 0 arg1used = true;
            if unspecifiedscount == 1 arg2used = true;
            break;
        case '1':
            if s[i+2] == '$' && s[i+3] == 's' {
                arg1used = true;
                i+=3;
                true;
            }
            break;
        case '2':
            if s[i+2] == '$' && s[i+3] == 's' {
                arg2used = true;
                i+=3;
                true;
            }
            break;
    }
}

Ben bu durumda çalışan bir kludgey yolu ile geldim, ama daha genel olarak daha iyi çözümler duymak ilgi olacaktır.

if (($result = @sprintf($input, "a")) === false) {
    // need two arguments
    $result = sprintf($input, "a", "b");
} else {
    // only needed one argument
}

Temelde, sadece tek bir argüman ile çalışır ve bu işe yaramadı eğer, o zaman iki ihtiyacı olduğunu biliyorum.