这可以在一行完成吗?

时间:2010-06-07 23:05:21

标签: php arrays indexing

这可以用PHP一行完成吗?

如果可能的话会很棒:

$out = array("foo","bar");
echo $out[0];

如:

echo array("foo","bar")[0];

不幸的是,这是不可能的。会这样吗?

所以我可以在一行中做到这一点:

echo array(rand(1,100), rand(1000,2000))[rand(0,1)];

所以让我说我有这个代码:

 switch($r){
      case 1: $ext = "com"; break;
      case 2: $ext = "nl"; break;
      case 3: $ext = "co.uk"; break;
      case 4: $ext = "de"; break;
      case 5: $ext = "fr"; break;
 }

这样做会更加简化:

$ext = array("com","nl","co.uk","de","fr")[rand(1,5)];

8 个答案:

答案 0 :(得分:4)

为什么不查看array functions on the PHP site

好吧,如果你从数组中选择一个随机元素,你可以使用array_rand()

$ext = array_rand(array_flip(array("com","nl","co.uk","de","fr")));

答案 1 :(得分:2)

echo array_rand(array_flip(array('foo', 'bar')));

数组翻转采用数组并使用值交换键,反之亦然。 array_rand从该数组中提取一个随机元素。

答案 2 :(得分:1)

是的,list一种PHP语言结构,允许使用下面的语法。

list( $first_list_element ) = array( "foo", ..... );

编辑:

仍然是的,错过了回声。 Reset将返回第一个数组项,可能并非总是为索引0,但如果您正常创建array,则会显示。

echo reset( array( "foo",... ) );

再次编辑:

在您更新问题后,我发现您想要一些PHP无法做好的事情。我个人认为这是PHP语言/解释器的语法设计错误。如果你只是意味着你可以这样做。

$array = array( .... ); echo $array[0];

答案 3 :(得分:1)

您可以使用简写形式将内容保持在一行,避免创建永远不会再使用的数组。

echo rand(0,1) ? rand(1,100) : rand(1000,2000);

答案 4 :(得分:0)

我认为你的榜样可能不是最好的。这里真正的语法限制是,无法立即对函数调用的返回值执行数组访问,如,

do_something_with(explode(',', $str)[0]);

而你几乎无法绕过它。分配给变量,然后访问。这是PHP的一个愚蠢的限制,但它就在那里。

你可以在技术上做到,

function array_access($array, $i) {
    return $array[$i];
}
do_something_with(array_access(explode(',', $str), 0));

但请不要。它甚至比额外的变量校准更加丑陋。

(鉴于该问题的编辑,这不再是一个充分的答案。但是,我会将其留作参考。)

答案 5 :(得分:0)

print $a[ array_rand($a = array('com','nl','co.uk','de','fr')) ];

答案 6 :(得分:0)

与@ Matchu的答案一样,这解决了更一般的情况,即你有一个来自某处的数组值,无论是函数调用,实例化数组,还是其他。由于任意函数的返回值是最不具体的情况,我将在此示例中使用some_function()的调用。

$first_element = current(array_slice(some_function(), 0, 1));

所以你可以用

随机化它
$random_element = current(array_slice(some_function(), rand(0,1), 1));

但是在那种情况下(就像许多人在php中),有一个更专业的功能;看@ animuson的回答。

编辑

将array_shift()调用更改为current()调用:这样效率更高,因为array_shift()将修改array_slice()返回的中间数组。

答案 7 :(得分:0)

目前正在内部邮件列表中对此进行讨论。您可能需要查看它:http://marc.info/?l=php-internals&m=127595613412885&w=2