PHP değişken değiştirme

8 Cevap

Bir dize params değiştirir herhangi bir işlevi var mı? Böyle bir şey:

Kod:

$format_str = "My name is %name."; /* this was set in a 
                                      configuration file - config.php */

$str = xprintf($format_str, array('name' => 'Joe', 'age' => 150)); 
              /* above is somewhere in main code */

Ameliyattan sonra $ str beklenen değeri:

My name is Joe.

Güncelle: Ben sprintf farkındayım. Ancak, bu durumda yeterli olmaz. Ben fark nedir göstermek için kodu olarak var.

8 Cevap

strtr aynı yapabileceği bir yerleşik işlevi budur gibi görünüyor. (Drupal kod geçiyor bu var).

>> $format_str = "My name is %name.";
My name is %name.
>> strtr($format_str, array('%name' => 'Joe', '%age' => 150))
My name is Joe.

Bu kullanabilirsiniz:

function xprintf($str, $array, $chr = '%') {

   foreach ($array as &$key => $val) {
       $key = $chr . $key;
   }

   return strtr($str, $array);
}

$str = xprintf('My name is %name', array('name' => 'Joe'));

Ne demek istiyorsun sprintf()?

$ Str = sprintf ("My name is% s.", 'Joe');

Bu fonksiyon, "harita" (ve yerine), benim web uygulama sisteminin bir parçasıdır:

function replace($search, $replace, $mixed)
{
    if (is_string($mixed)) {
        return @str_replace($search, $replace, $mixed);
    } else if (is_array($mixed)) {
        foreach ($mixed as $k => $v) {
            $mixed[$k] = replace($search, $replace, $v);
        }
        return $mixed;
    } else {
        return $mixed;
    }
}


function map($a, $contents, $case_sensitive=false)
{
    if (!is_array($a)) {
        return $contents;
    }
    if (!$case_sensitive) {
        $a = array_change_key_case($a);
    }
    $s = array();
    $r = array();
    foreach ($a as $k => $v) {
        if (is_scalar($v) || empty($v)) {
            $s[] = "{".$k."}";
            $r[] = $v;
        }
    }
    if (!$case_sensitive) {
        $contents = preg_replace_mixed('/{([-_ =,.\/\'"A-Za-z0-9]+)}/ei', "'{'.strtolower('\\1').'}'", $contents);
    }
    return replace($s, $r, $contents);
}

Çok iyi bir iş yok. Parantez değişken isimleri ile herhangi bir dize sağlarsanız, ve hile yok.

Sözdizimi farklı, ama amaçlar için modifiye edilebilir:

$str = map(array('name' => 'Joe'), 'My name is {name}');

Ben% sözdizimi üzerinden tercih.

Sen vsprintf arıyoruz. http://us2.php.net/vsprintf

Bu belirtildiği gibi argümanlar dizisini geçmesine izin verir.

printf() bir koşuşturma vererek deneyin. Bu web sitesi printf ile dizileri kullanmak için bir çok örnek vardır.

printf("My name is %s", "Joe");

Her zaman eval ... (gasp!) kullanabilirsiniz

$myStr = 'Hi my name is $name. I\'m $age years old.';
$myVars = array("name" => "Joe", "age" => 6);
$parsed = parseString($myStr, $myVars);

function parseString($str, $vars) {
    extract($vars);
    return eval('return "' . addslashes($str) . '";');
}

Herkes extract VE eval kullanımı hakkında huysuz gelmeden önce, sürece girdi şablonu dize üzerinde kontrole sahip olarak, ben bu bir güvenlik sorunu olabilir nasıl göremiyorum.

PHP sprintf kullanmadan bir diziden değerleri indirebiliriz ():

$data = array('name' => 'Joe', 'age' => 150);
print "My name is $data[name], my age is $data[age].";