严重困在这里:我必须比较字符串的前两个值并返回字符串的第三部分。 例如,如果(80 <88&amp; 88&lt; 96&lt; 96)返回1000.目前因为我正在使用array_walk我只是变得真实或错误。除了做多个foreach之外还有其他任何工作吗?
$fortuneArray = ['1'=> '80 | 96 | 1000','2'=>'3648|4000|100'];
$valueToBeCompared = ['88'];
$val =array_walk($fortuneArray,'test_print',$valueToBeCompared);
function test_print($fortuneArray,$valueToBeCompared)
{
$compare = explode('|',$fortuneArray);
if($compare[0] < $valueToBeCompared && $compare[1] > $valueToBeCompared){
return $compare[2];
}
}
答案 0 :(得分:1)
<?php
$fortuneArray = ['1' => '80 | 96 | 1000', '2' => '3648|4000|100'];
$valueToBeCompared = ['88'];
//1. here you are passing an array so while comparison use its zero index
//2. This is the third parameter passed in callback not second
$result="";
$val = array_walk(
$fortuneArray,
function ($fortuneArray, $key,$valueToBeCompared) use (&$result)
{
$compare = explode('|', $fortuneArray);
$compare=array_map("trim",$compare);//each value should be trimmed from spaces
if ($compare[0] < $valueToBeCompared[0] && $compare[1] > $valueToBeCompared[0])
{
$result = $compare[2];
}
}, $valueToBeCompared);
echo $result;
<强>输出:强>
1000
答案 1 :(得分:1)
通过语法
bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )
它将返回布尔值,即true或false。
如果你想要从中获取值,你可以通过地址传递变量,因此相对值将存储在该变量中。
以下是示例
$fortuneArray = ['1' => '80 | 96 | 1000', '2' => '3648|4000|100'];
$valueToBeCompared = 88;
$result = '';
array_walk($fortuneArray, function ($fortuneArray, $key, $valueToBeCompared) use (&$result)
{
$compare = explode(' | ', $fortuneArray);
if ($compare[0] < $valueToBeCompared && $compare[1] > $valueToBeCompared) {
$result = $compare[2];
}
}, $valueToBeCompared);
echo $result;
我认为$result
就是你所需要的。
演示link。
答案 2 :(得分:0)
首先是解决方案,然后解释......
OP的未修改输入:
$fortuneArray=['1'=> '80 | 96 | 1000','2'=>'3648|4000|100'];
$valueToBeCompared=['88'];
代码:
$mapped=max(array_map(function($v)use($valueToBeCompared){
return (preg_match_all('/\d+/',$v,$c) && $c[0][0]<$valueToBeCompared[0] && $c[0][1]>$valueToBeCompared[0])?$c[0][2]:null;
},$fortuneArray));
echo "Mapped = $mapped";
结果:
Mapped = 1000
array_walk()
会返回您所说的真/假回复。如果要使用数组迭代函数并在同一行中直接声明结果(或简单地回显它),则可以使用array_map()
。
由于您的$fortuneArray
具有不同的分隔符,因此无法依赖explode()
来始终返回修剪后的数字(不使用trim()
,intval()
等执行额外步骤,除非您可以标准化您的输入分隔符,您需要采取必要的预防措施以确保比较值可以使用。我使用preg_match_all()
因为我不想修改您的示例输入我想用一个函数来提取值。
如果您的比较值只满足$fortuneArray
个字符串之一,那么您可以使用max()
返回所需的字符串(因为所有其他值将返回null。如果您想要{{1成为包含所有条件结果的数组,然后从$mapped
中删除max()
函数。
array_map()
内部的3部分条件语句首先从管道字符串中提取值,然后在第二和第三个条件中使用生成的匹配数组。一旦任何条件表达式返回错误结果,返回值将为array_map
- 这使事情变得干净和高效。
为了表达在null
上使用array_map()
的优势, 可以避免声明结果变量并立即在单个值中回显限定值(但可怕的长)这样的线。
代码:
array_walk()
输出:
echo max(array_map(function($v)use($valueToBeCompared){return (preg_match_all('/\d+/',$v,$c) && $c[0][0]<$valueToBeCompared[0] && $c[0][1]>$valueToBeCompared[0])?$c[0][2]:null;},$fortuneArray));
答案 3 :(得分:0)
不建议使用功能迭代器来完成此任务。使用break
able循环将提供最佳性能,因为一旦遇到符合条件的数据集,就没有必要进行进一步的迭代。
代码:(Demo)
$fortuneArray = [
'1' => '80 | 96 | 1000',
'2' => '3648|4000|100'
];
$valueToBeCompared = ['88'];
$result = null;
foreach ($fortuneArray as $dataset) {
[$min, $max, $fortune] = explode('|', $dataset);
if ((int)$min < $valueToBeCompared[0] && $valueToBeCompared[0] < (int)$max) {
$result = (int)$fortune;
break;
}
}
echo $result; // 1000
一些注意事项:
您应规范化$fortuneArray
语法以删除运算符。在此之前,我通过将爆炸值转换为整数来删除空格。
$valueToBeCompared
应该是标量值。将其声明为数组没有好处。
编写脚本以避免不必要的迭代,清楚地表明程序员知道他们在做什么。即使性能提升不明显,这也是最佳实践。无论您选择使用哪种技术,都应在循环暂停过程中包括break
或return
。