这可能吗?
就像创建一个包含所有具有特定前缀的变量的数组一样?
我不需要键只是值,但我想我可以在数组上使用array_values。
答案 0 :(得分:3)
如果你需要这样做,那么开头可能写得不是很好,但是,这里是如何做到的:)
$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
);
*/
答案 1 :(得分:2)
我的眼睛有点流血,但我无法抗拒一个衬垫。
print_r(iterator_to_array(new RegexIterator(new ArrayIterator(get_defined_vars()), '/^' . preg_quote($prefix) . '/', RegexIterator::GET_MATCH, RegexIterator::USE_KEY)));
答案 2 :(得分:1)
如果您在谈论全局范围内的变量,可以使用$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()
,但输入速度会更快。
我想添加(虽然我怀疑你已经知道)如果你有能力重构这段代码,你最好先将相关的变量组合成一个数组。
答案 3 :(得分:1)
这是我的第二个答案,它通过使用一个简单的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',
)