用于解引用函数结果的PHP语法
背景 在我经常使用的其他编程语言中,对函数的返回值进行操作很简单,无需声明新变量来保存函数结果 然而,在PHP中,这似乎并不是那么简单: 示例1(函数结果为数组)用于解引用函数结果的PHP语法,php,arrays,syntax,function,Php,Arrays,Syntax,Function,背景 在我经常使用的其他编程语言中,对函数的返回值进行操作很简单,无需声明新变量来保存函数结果 然而,在PHP中,这似乎并不是那么简单: 示例1(函数结果为数组) 示例2(函数结果是一个对象) PHP无法从函数访问数组结果。有些人把这称为一个问题,有些人只是接受这是语言的设计方式。因此,PHP让您创建不重要的变量只是为了提取所需的数据 所以你需要这样做 $var = foobar(); print($var[0]); PHP无法从函数访问数组结果。有些人把这称为一个问题,有些人只是接受这是
示例2(函数结果是一个对象)
PHP无法从函数访问数组结果。有些人把这称为一个问题,有些人只是接受这是语言的设计方式。因此,PHP让您创建不重要的变量只是为了提取所需的数据 所以你需要这样做
$var = foobar();
print($var[0]);
PHP无法从函数访问数组结果。有些人把这称为一个问题,有些人只是接受这是语言的设计方式。因此,PHP让您创建不重要的变量只是为了提取所需的数据 所以你需要这样做
$var = foobar();
print($var[0]);
那么,根据具体情况,您可以使用以下任一解决方案:
function foo() {
return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"
或者可以使用list()从返回的数组中获取特定值:
编辑:我前面给出的每个()的示例代码都不正确。each()返回一个键值对。因此,使用foreach()可能更容易:
那么,根据具体情况,您可以使用以下任一解决方案:
function foo() {
return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"
或者可以使用list()从返回的数组中获取特定值:
编辑:我前面给出的每个()的示例代码都不正确。each()返回一个键值对。因此,使用foreach()可能更容易:
编写一个包装函数来完成同样的任务。由于PHP易于类型转换,这可能是非常开放的:
function array_value ($array, $key) {
return $array[$key];
}
编写一个包装函数来完成同样的任务。由于PHP易于类型转换,这可能是非常开放的:
function array_value ($array, $key) {
return $array[$key];
}
这行吗
return ($foo->getBarArray())[0];
否则,可以发布getBarArray()函数吗?从你目前发布的内容来看,我不明白为什么这样做行不通。这行吗
return ($foo->getBarArray())[0];
否则,可以发布getBarArray()函数吗?从您目前发布的内容来看,我不明白为什么这样做行不通。不幸的是,没有一种方法可以做到这一点,尽管在大多数其他编程语言中都是这样 如果你真的想做一个单行程序,你可以做一个叫做a()的函数
$test = a(func(), 1); // second parameter is the key.
<?php
class Example {
function getBarArray() {
$array = new ArrayObject();
$array[] = 'uno';
$array->append('dos');
$array->append('tres');
return $array;
}
}
$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);
但除此之外,PHP不支持func()[1]。不幸的是,尽管在大多数其他编程语言中都支持func()[1] 如果你真的想做一个单行程序,你可以做一个叫做a()的函数
$test = a(func(), 1); // second parameter is the key.
<?php
class Example {
function getBarArray() {
$array = new ArrayObject();
$array[] = 'uno';
$array->append('dos');
$array->append('tres');
return $array;
}
}
$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);
但除此之外,PHP中不支持func()[1]。这太牵强了,但如果您确实需要将其放在一行中:
return index0( $foo->getBarArray() );
/* ... */
function index0( $some_array )
{
return $some_array[0];
}
这太牵强了,但如果您确实需要将其放在一行中:
return index0( $foo->getBarArray() );
/* ... */
function index0( $some_array )
{
return $some_array[0];
}
正如其他人所提到的,这是不可能的。PHP的语法不允许这样做。然而,我确实有一个建议从另一个方向攻击这个问题
如果你在控制<代码> GETBARARTALS/<代码>方法,并且可以访问PHP标准库(安装在许多PHP 5.2 .x主机上,默认情况下用PHP 5.3安装),你应该考虑返回<代码> <代码>,而不是本地PHP数组/集合。code>ArrayObject有一个
方法,可用于检索任何索引,因此您的代码可能类似于
$test = a(func(), 1); // second parameter is the key.
<?php
class Example {
function getBarArray() {
$array = new ArrayObject();
$array[] = 'uno';
$array->append('dos');
$array->append('tres');
return $array;
}
}
$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);
正如其他人所提到的,这是不可能的。PHP的语法不允许这样做。然而,我确实有一个建议从另一个方向攻击这个问题
如果你在控制<代码> GETBARARTALS/<代码>方法,并且可以访问PHP标准库(安装在许多PHP 5.2 .x主机上,默认情况下用PHP 5.3安装),你应该考虑返回<代码> <代码>,而不是本地PHP数组/集合。code>ArrayObject有一个
方法,可用于检索任何索引,因此您的代码可能类似于
$test = a(func(), 1); // second parameter is the key.
<?php
class Example {
function getBarArray() {
$array = new ArrayObject();
$array[] = 'uno';
$array->append('dos');
$array->append('tres');
return $array;
}
}
$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);
如果只想返回数组中的第一项,请使用current()函数
return current($foo->getBarArray());
如果只想返回数组中的第一项,请使用current()函数
return current($foo->getBarArray());
事实上,我已经编写了一个允许此类行为的库:
适用于一切:函数、方法。缓存,因此与PHP本身一样快:)实际上,我已经编写了一个库,允许这种行为:
适用于一切:函数、方法。缓存,因此与PHP本身一样快:)经过进一步研究,我相信答案是否定的,像这样的临时变量确实是处理函数返回的数组的标准方法
return current($foo->getBarArray());
看起来这将从PHP5.4开始改变
此外,这个答案最初是针对这个问题的:
经过进一步研究,我相信答案是否定的,像这样的临时变量确实是处理函数返回的数组的标准方法
return current($foo->getBarArray());
看起来这将从PHP5.4开始改变
此外,这个答案最初是针对这个问题的:
当然,您可以返回一个对象而不是数组,并通过以下方式访问它:
echo "This should be 2: " . test()->b ."\n";
但是我没有发现用数组实现这一点的可能性:(当然,您可以返回一个对象而不是数组,并通过以下方式访问它:
echo "This should be 2: " . test()->b ."\n";
但我没有发现用数组执行此操作的可能性:(如果只是美观,那么如果返回对象,对象表示法将起作用。就内存管理而言,如果进行了临时复制,则不会产生临时副本,只会更改引用。如果只是美观,则如果返回对象,对象表示法将起作用。就内存管理而言,如果进行了临时复制,则只会进行更改参考中。我通常的解决方法是使用这样的通用函数
function e($a, $key, $def = null) { return isset($a[$key]) ? $a[$key] : $def; }
然后
echo e(someFunc(), 'key');
另外,这还可以避免在不需要时出现“未定义索引”警告
至于foo()[x]
不起作用的原因,ans
$array = $foo->getBarArray();
$first_item = $foo->getBarArray(0);
// can php say "homer"?
// print zoobar()->fname; // homer <-- yup
function returnArray() {
return array(1, 2, 3);
}
$tmp = returnArray();
$ssecondElement = $tmp[1];
function returnArray() {
return array(1, 2, 3);
}
$secondElement = returnArray()[1];
echo [1, 2, 3][1];
echo 'PHP'[1];