array_walk返回true或false。需要返回一个变量

时间:2017-04-12 12:27:37

标签: php arrays

严重困在这里:我必须比较字符串的前两个值并返回字符串的第三部分。 例如,如果(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];
            }
        }

4 个答案:

答案 0 :(得分:1)

PHP code demo

<?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应该是标量值。将其声明为数组没有好处。

  • 编写脚本以避免不必要的迭代,清楚地表明程序员知道他们在做什么。即使性能提升不明显,这也是最佳实践。无论您选择使用哪种技术,都应在循环暂停过程中包括breakreturn