arrayfill php_PHP-使用匿名函数与array_fill

因此,我的目标是创建一个随机字母字符串,并且字母可以在字符串中重复.所以我想我可以很聪明,做到这一点:

$str = implode(

array_fill(0,10,

function(){

$c='abcdefghijklmnopqrstuvwxyz';

return (string)$c{rand(0,strlen($c)-1)};

}

)

);

echo $str;

但是我收到以下错误:

Catchable fatal error: Object of class Closure could not be converted

to string in …

从字面上看,这是我脚本中唯一的事情,所以不,不是别的.现在,手册指出array_fill的第3个arg描述为“用于填充的值”,并被列为接受混合类型.现在我知道“ mixed”不一定等于“ any”类型,但是对我来说,只要它返回字符串,我就应该能够将匿名函数用作第三个arg,对吗?但是显然我做不到.

因此,我并不一定要问为什么我不能这样做.它很可能归结为强大的功能-就是根本不将其写入后台代码.但是我想我只是想仔细检查一下我是否正确执行了这段代码,如果php允许它“应该”可以工作(但不允许这样做),那么也许我以某种方式弄乱了其他地方?

解决方法:

如果没有该函数的显式变体,则没有理由期望函数执行您的回调,而不是简单地将其保留为变量.

让我们分解一下逻辑:

// Declare the callback

$something = function(){

$c='abcdefghijklmnopqrstuvwxyz';

return (string)$c{rand(0,strlen($c)-1)};

}

无论此函数做什么,我们现在都有一个恰好是Closure的变量.

// Fill the array

$list = array_fill(0,10,$something);

现在,阵列中已满了10个$something副本.碰巧是我们关闭的10个指针. PHP没有理由认为这不是您想要的.

// Join up the items in the array to make a string

$str = implode($list);

现在,implode()必须创建一个字符串,因此它将继续处理之前将数组中的每个项目转换为字符串.对于一个对象,它将尝试调用__toString()(或对于内置对象而言等效的“在幕后”),但是Closure没有这种方法.这是您的错误出处.

因此,不,您并没有完全搞砸,但是仅仅因为您知道这就是您想要的,就认为PHP将执行回调是不合理的.

正如Mark Baker在注释中指出的那样,您可以使用array_map执行回调;从上面重复使用$,然后为了清楚起见将其分解:

// Create 10 items, with nothing interesting in them

$list_of_nulls = array_fill(0, 10, null);

// Run the callback for each item of that list

// It will be given the current value each time, but ignore it

$list = array_map($something, $list_of_nulls);

// Now you have the list you wanted to join up

$str = implode($list);

当然,您也可以在一个循环中运行该函数10次:

$str = '';

for ( $i=0; $i<10; $i++ ) {

$str .= $something();

}

标签:anonymous-function,php

来源: https://codeday.me/bug/20191122/2057147.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值