これは可能ですか?
特定の接頭辞を持つすべての変数で配列を作成するようなものですか?
値だけのキーは必要ありませんが、配列でarray_valuesを使用できると思います。
これを行う必要がある場合は、そもそもうまく書かれていない可能性がありますが、その方法は次のとおりです:)
$foobar = 'test';
$anothervar = 'anothertest';
$foooverflow = 'fo';
$barfoo = 'foobar';
$prefix = 'foo';
$output = array();
$vars = get_defined_vars();
foreach ($vars as $key => $value) {
if (strpos($key, $prefix) === 0) $output[] = $value;
}
/*
$output = array(
'test', // from $foobar
'fo', // from $foooverflow
);
*/
目が少し出血していますが、ワンライナーに抵抗できませんでした。
print_r(iterator_to_array(new RegexIterator(new ArrayIterator(get_defined_vars()), '/^' . preg_quote($prefix) . '/', RegexIterator::GET_MATCH, RegexIterator::USE_KEY)));
グローバルスコープの変数について話している場合は、次のコマンドでこれを行うことができます$GLOBALS[]
。
$newarray = array();
// Iterate over all current global vars
foreach ($GLOBALS as $key => $value) {
// And add those with keys matching prefix_ to a new array
if (strpos($key, 'prefix_' === 0) {
$newarray[$key] = $value;
}
}
グローバルスコープにたくさんの変数がある場合、これらすべてを手動で追加するよりも実行が遅くなりますがcompact()
、入力は速くなります。
このコードをリファクタリングする機能がある場合は、最初に関連する変数を1つの配列にグループ化する方がよいと付け加えておきます(すでにご存知だと思いますが)。
これは、私の2番目の答えであり、単純なPHPオブジェクトを使用して、グローバルスコープを混乱させることなくこれを行う方法を示しています。
$v = new stdClass();
$v->foo = "bar";
$v->scope = "your friend";
$v->using_classes = "a good idea";
$v->foo_overflow = "a bad day";
echo "Man, this is $v->using_classes!\n";
$prefix = "foo";
$output = array();
$refl = new ReflectionObject($v);
foreach ($refl->getProperties() as $prop) {
if (strpos($prop->getName(), $prefix) === 0) $output[] = $prop->getValue($v);
}
var_export($output);
出力は次のとおりです。
Man, this is a good idea!
array (
0 => 'bar',
1 => 'a bad day',
)