Синтаксис PHP для разыменования функционального результата

Фон

На любом языке программирования я использую регулярно, просто воздействовать на возвращаемое значение функции, не объявляя, что новая переменная содержит функциональный результат.

В PHP, однако, это, кажется, не так просто:

example1 (функциональным результатом является массив),

<?php 
function foobar(){
    return preg_split('/\s+/', 'zero one two three four five');
}

// can php say "zero"?

/// print( foobar()[0] ); /// <-- nope
/// print( &foobar()[0] );     /// <-- nope
/// print( &foobar()->[0] );     /// <-- nope
/// print( "${foobar()}[0]" );    /// <-- nope
?>

example2 (функциональным результатом является объект),

<?php    
function zoobar(){
  // NOTE: casting (object) Array() has other problems in PHP
  // see e.g., http://stackoverflow.com/questions/1869812
  $vout   = (object) Array('0'=>'zero','fname'=>'homer','lname'=>'simpson',);
  return $vout;
}

//  can php say "zero"?       
//  print zoobar()->0;         //  <- nope (parse error)      
//  print zoobar()->{0};       //  <- nope                    
//  print zoobar()->{'0'};     //  <- nope                    
//  $vtemp = zoobar();         //  does using a variable help?
//  print $vtemp->{0};         //  <- nope     
34
задан dreftymac 1 August 2019 в 10:45
поделиться

3 ответа

PHP не может получить доступ к результатам массива из функции. Некоторые люди называют это проблемой, некоторые просто принимают это как то, как разработан язык. Поэтому PHP заставляет вас создавать необязательные переменные просто для извлечения нужных вам данных.

Так что вам нужно сделать.

$var = foobar();
print($var[0]);
26
ответ дан Ólafur Waage 27 November 2019 в 16:00
поделиться

Ну, вы можете использовать любое из следующих решений, в зависимости от ситуации:

function foo() {
    return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"

Или вы можете получить конкретные значения из возвращенного массива с использованием list () :

list($foo, $bar) = foo();
echo($foo); // prints "foo"
echo($bar); // print "bar"

Редактировать: пример кода для each () , который я дал ранее, был неверным. each () возвращает пару ключ-значение. Так что было бы проще использовать foreach () :

foreach(foo() as $key=>$val) {
    echo($val);
}
14
ответ дан Calvin 27 November 2019 в 16:00
поделиться

Напишите функцию-оболочку, которая будет выполнять то же самое. Из-за простого преобразования типов в PHP это может быть довольно неограниченно:

function array_value ($array, $key) {
return $array[$key];
}
5
ответ дан 27 November 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: