PHP5 referans yoluyla dize değişkenleri Kırpma

6 Cevap php

Ben dizi içerdiği dize değişkenleri kesmek için bu deyimi kullanarak düşündüren başka bir yazı gördüm:

$_POST=array_map('trim', $_POST);

Ilk etapta, dizeleri bir dizide yer almayan, ancak ben bu gibi kullanılabilir bir trim fonksiyonu var istiyorum:

$a='  aaa ';
$b='  bbb ';
$c='  ccc ';
trimAll($a,$b,$c); //arbitrary number of string variables can be passed

Ben böyle bir işlevi yazmak çalıştı:

function trimAll() {

    $args = &func_get_args();
    foreach($args as &$arg) {
        if(isset($arg) && is_string($arg))
            $arg=&trim($arg);
    }
      //no return value is required
}

Ama başarı olmadan, dize değişkenleri fonksiyon döndükten sonra kesilmiş alamadım.

Neden ve nasıl bu yapılabilir?

6 Cevap

Eğer referans ile parametre değişken sayısını geçemez. Geçici bir çözüm olarak, böyle bir şey deneyin

list($a, $b, $c) = array_map('trim', array($a, $b, $c));

her durumda kötü bir fikir olduğunu değişkenlerin bir demet kullanmak gerekmez ki daha iyisi, pasajı yeniden

Bu da çalışır, ancak büyük olasılıkla onun çok unintuitive gibi sinirli çalışmak gelebilecek herkes yapacak:

// pass variables by string name
extract(array_map('trim', compact('a', 'b', 'c')));

Ben size referans args bir değişken uzunlukta listesi geçebilir sanmıyorum.

Referansların bir dizi geçebileceği.

function trimAll($array) {
    foreach($array as $k => $v) {
        if(isset($array[$k]) && is_string($array[$k]))
            $array[$k]=&trim($array[$k]);
    }
}

... Ve uygun referansların bir dizi oluşturmak için çağrı değiştirin.

$a='  aaa ';
$b='  bbb ';
$c='  ccc ';
trimAll(array(&$a,&$b,&$c));

Bunun üzerine bir yorum olsa ben PHP kılavuzu sayfa olası bir alternatif çözüm önerir, bu func_get_args kullanılarak mümkün olduğu kanaatinde değilim: http://uk3.php.net/manual/en/function.func-get-args.php#90095

Ancak user187291 adlı geçici çözüm çok basit görünüyor.

Eğer Referans tarafından değişkenler geçen denedim.

trimAll(&$a,&$b,&$c)

Bu çalışır, ama pass-by-reference PHP 5.3 önerilmiyor, çağrı saati kullanır:

function trimAll() {
    $backtrace = debug_backtrace();
    foreach($backtrace[0]['args'] as &$arg)
        if(isset($arg) && is_string($arg))
            $arg=trim($arg);
}
$a='  aaa ';
$b='  bbb ';
$c='  ccc ';
trimAll(&$a,&$b,&$c);
echo "$a\n";
echo "$b\n";
echo "$c\n";