你可以在未获取数组的情况下从数组中获取值吗?

5
请耐心等待,我正在学习。

我经常看到下面这样的片段:

<?p
$imageArray = get_field('image_field');
$imageAlt = $imageArray['alt'];
$imageURL = $imageArray['url'];
?>

这段代码具有教育性、清晰和有组织。但是在查询数组值之前是否需要获取整个数组?我不能只在单独的一行中定义变量吗?像下面这样(它不起作用,我尝试了其他变体也不行):

$imageAlt = get_field('image_field', ['alt']);
$imageURL = get_field('image_field', ['url']);
4个回答

7

是的,你可以。

自PHP 5.4版本起,可以直接数组解引用函数或方法调用的结果。在此之前只能使用临时变量。- 来源

$imageAlt = get_field('image_field')['alt'];

https://eval.in/548036


6

您所提出的问题可以通过以下两个问题来回答:

  1. 它能做到吗?
  2. 以这种方式做是否是一个好主意?

它能做到吗?

是的!您不需要将数组存储在变量中并稍后重复使用。

例如,您可以执行以下操作:

$imageAlt = get_field('image_field')['alt'];

注意:这仅适用于PHP 5.4+,称为:Array dereferencing
但这并不是唯一的考虑因素...
在许多情况下,这不是一个好主意。根据您的上下文,get_field()函数可能会执行很多工作,并且每次调用它时,相同的工作都会被多次执行。
假设您使用count()函数。它将计算数组中的项目数。为此,它必须遍历所有项目以获取值。
如果每次需要验证数组中的项目数时都使用count()函数,则每次都要进行计数任务。如果您的数组有10个项目,您可能不会注意到。但如果您的数组中有数千个项目,则可能会导致延迟问题以计算您的代码(也就是说,它将变慢)。
这就是为什么你会想要做类似这样的事情:$count = count($myArray); 并使用变量而不是调用函数。

你的问题也是如此。


2
PHP 5.4+允许您像这样直接取消引用函数返回值:
get_field('image_field')['alt']

在这种情况下,我不建议您这样做,因为您正在使用结果数组中的两个值。函数调用本身就有一定的开销,此外,在函数返回结果之前,您不知道函数在后台执行了什么操作。如果您调用该函数两次,则可能会产生大量不必要的工作,而单个函数调用就足以胜任。
更不用说保持代码的DRY性(不要重复自己); 如果您需要更改函数调用的细节,现在您需要更改两次...

0

PHP 允许你进行很多操作:

  function foo(){
    return array('foo' => 1, 'bar' => 2);
  }

选项1

  echo foo()['foo']; // 1

  # Better do this if you plan to reuse the array value.
  echo ($tmp = foo())['foo']; // 1
  echo $tmp['bar']; // 2

不建议调用返回数组的函数,仅获取1个键并在下一行执行相同操作。

因此最好将函数的结果存储在变量中,以便稍后使用。

选项2

  list($foo, $bar) = array_values(foo()); 
   #foo is the first element of the array, and sets in $foo.
   #bar is the second element, and will be set in $bar.
   #This behavior is in PHP 7, previously it was ordered from right to left.
  echo $foo, $bar; // 12

选项3

  extract(foo()); // Creates variable from the array keys.
  echo $foo, $bar;

  extract(get_field('image_field'));
  echo $alt, $url;

了解有关列表构造函数和提取函数的更多信息。


您的意思是 $alt = ($f = get_field('image_field')); 吗? - ʰᵈˑ
@ʰᵈˑ 没有,我没有。虽然我现在更新了代码,但你的代码结果是$alt具有与$f相同的值,而$alt = ($f = get_field('image_field'))['alt'];则正确地将$alt设置为返回数组中$f结果的键。 - Xorifelse
可以理解,因此我通常避免像这样链接事物。 - Xorifelse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接