PHP5の参照による文字列変数のトリミング
-
08-07-2019 - |
質問
このステートメントを使用して配列に含まれる文字列変数をトリミングすることを提案する別の投稿を見ました:
このステートメントを使用して配列に含まれる文字列変数をトリミングすることを提案する別の投稿を見ました:
$a=' aaa ';
$b=' bbb ';
$c=' ccc ';
trimAll($a,$b,$c); //arbitrary number of string variables can be passed
ただし、そもそも文字列が配列に含まれていない場合は、次のように使用できるトリム関数が必要です。
function trimAll() {
$args = &func_get_args();
foreach($args as &$arg) {
if(isset($arg) && is_string($arg))
$arg=&trim($arg);
}
//no return value is required
}
次のような関数を記述しようとしました:
<*>
ただし、成功しなかった場合、文字列変数は関数が戻った後にトリミングされません。
なぜこれを行うことができるのですか?
POST=array_map('trim', このステートメントを使用して配列に含まれる文字列変数をトリミングすることを提案する別の投稿を見ました:
<*>
ただし、そもそも文字列が配列に含まれていない場合は、次のように使用できるトリム関数が必要です。
<*>
次のような関数を記述しようとしました:
<*>
ただし、成功しなかった場合、文字列変数は関数が戻った後にトリミングされません。
なぜこれを行うことができるのですか?
POST);
ただし、そもそも文字列が配列に含まれていない場合は、次のように使用できるトリム関数が必要です。
<*>次のような関数を記述しようとしました:
<*>ただし、成功しなかった場合、文字列変数は関数が戻った後にトリミングされません。
なぜこれを行うことができるのですか?
解決
参照により可変数のパラメーターを渡すことはできません。回避策として、次のようなものを試してください
list($a, $b, $c) = array_map('trim', array($a, $b, $c));
さらに、スニペットを書き換えて、変数の束を使用する必要がないようにします。これはとにかく悪い考えです
他のヒント
これも機能しますが、非常に直感的ではないため、あなたがたまたま仕事をする人をイライラさせる可能性があります:
// pass variables by string name
extract(array_map('trim', compact('a', 'b', 'c')));
参照の引数の可変長リストを渡すことができるとは思わない。
参照の配列を渡すことができます。
function trimAll($array) {
foreach($array as $k => $v) {
if(isset($array[$k]) && is_string($array[$k]))
$array[$k]=&trim($array[$k]);
}
}
...そして、呼び出しを適切に変更して、参照の配列を作成します。
$a=' aaa ';
$b=' bbb ';
$c=' ccc ';
trimAll(array(&$a,&$b,&$c));
func_get_argsを使用してこれが可能であるとは確信していませんが、PHPのマニュアルページへのコメントは、1つの可能な解決策を提案しています: http://uk3.php.net/manual/en/function.func-get-args.php#90095
ただし、user187291の回避策ははるかに簡単に見えます。
参照によって変数を渡してみましたか。
trimAll(&$a,&$b,&$c)
これは機能しますが、呼び出し時の参照渡しを使用します。これはPHP 5.3で非推奨です:
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";