Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用带有数组填充的匿名函数_Php_Anonymous Function - Fatal编程技术网

Php 使用带有数组填充的匿名函数

Php 使用带有数组填充的匿名函数,php,anonymous-function,Php,Anonymous Function,所以我的目标是创建一个随机字母字符串,这些字母可以在字符串中重复。所以我想我可以聪明一点,这样做: $str = implode( array_fill(0,10, function(){ $c='abcdefghijklmnopqrstuvwxyz'; return (string)$c{rand(0,strlen($c)-1)}; } ) ); echo $str; 但我收到以下错误: 可捕获的致命错误:无法转换类闭包的对象 串入 这是我剧

所以我的目标是创建一个随机字母字符串,这些字母可以在字符串中重复。所以我想我可以聪明一点,这样做:

$str = implode(
  array_fill(0,10,
    function(){ 
      $c='abcdefghijklmnopqrstuvwxyz';
      return (string)$c{rand(0,strlen($c)-1)};
    }
  )
);
echo $str;
但我收到以下错误:

可捕获的致命错误:无法转换类闭包的对象 串入

这是我剧本中唯一的东西,所以不,不是别的东西。现在,手册说明
array\u fill
的第三个参数说明是“用于填充的值”,并将其列为接受混合类型。现在我知道“mixed”不一定等同于“any”类型,但对我来说,我应该能够使用匿名函数作为第三个参数,只要它返回字符串,这似乎是合理的,对吗?但显然我不能这么做


所以,我不一定要问为什么我不能这样做;这很可能归结为不在幕后将其写入代码的权力。但我想我只是想再次检查一下我的代码是否“正确”,如果php允许(但不允许),它“应该”工作,而不是我在其他地方搞砸了?

如果没有函数的显式变体,没有理由期望函数执行回调,而不是简单地把它作为一个变量

让我们把逻辑分解一下:

// Declare the callback
$something = function(){ 
  $c='abcdefghijklmnopqrstuvwxyz';
  return (string)$c{rand(0,strlen($c)-1)};
}
不管这个函数做什么,我们现在有一个变量,它恰好是一个
闭包

// 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);
现在,
infrade()
必须生成一个字符串,因此在继续之前,它会将数组中的每个项转换为一个字符串。对于对象,它将尝试调用
\uuu toString()
(对于内置对象,或等效的“引擎盖下”),但
Closure
没有此类方法。这就是你的错误的来源

所以,不,您还没有完全搞砸,但是假设PHP会执行回调是不合理的,因为您知道这是您想要的

// Join up the items in the array to make a string
$str = implode($list);

正如注释中指出的,您可以使用
array\u map
执行回调;重复使用上面的
$something
,并为清晰起见将其分解:

// 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();
}
$str='';
对于($i=0;$i),这可以通过和完成:


它将不起作用,因为您传递的是一个函数而不是一个值。除非执行该函数,否则该函数返回一个值并不重要。在此之前,它只是一个值的方法。您可以通过使用接受回调的函数来模拟您试图实现的目标:
$str=introde(array\u map(function($value)){$c='abcdefghijklmnopqrstuvwxyz';return(string)$c{rand(0,strlen($c)-1)},array_fill(0,10,NULL));echo$str;
@MarkBaker是的,这基本上是我在等待回复时想到的。不过我会把答案交给IMSoP,因为a)你没有发布答案!并且b)他解释了错误的确切来源。谢谢!你的问题是关于错误的,@IMSoP已经回答了…我所做的只是提供了一个简单的替代方案来代替你的基本代码,但它实际上没有回答问题,所以不值得作为答案发布啊,谢谢你对我的解释错误的真正来源;这是有道理的。我想出了一个alt,很像马克的评论,但是你的解释帮助我晚上睡得更好,谢谢!还有,是的。我不知怎么想,做一些涉及回调的事情会更少代码,看起来更聪明,但是仅仅使用一个普通的l会少很多代码哎哟,
$str.=…
我想我只是在尝试变得聪明的时候被迷住了:/啊,是的,聪明和时尚的诱惑与简洁和简单的诱惑,我很清楚!)