8

我是 PHP 新手,我正在尝试将一个简单的 Javascript 函数转换为 PHP 函数。到目前为止,我知道只转换变量,我需要排序函数和数组过滤器的帮助。谢谢你的帮助!

var closeRoll = function( number ) {
  var rollArray = [36, 48, 60, 72];
  var closest = rollArray.filter(function(ele){
    return ele - number >= 0
  }).sort()[0];
  return closest;   
};

我的一半转换:

function closeRoll( $number ) { 
  $rollArray = Array(36, 48, 60, 72);
  $closest = array_filter( $rollArray, function temp( $rollArray ) {
    return $rollArray - $number >= 0;
  }); //.sort()[0];
  return $closest;   
};
4

5 回答 5

3

你非常接近,PHP 中的变量范围有点不同:

function closeRoll( $number ) { 
    $rollArray = Array(36, 48, 60, 72);
    $closest = array_filter( $rollArray, function($rollArray) use ($number) {
        return $rollArray - $number >= 0;
    }); //.sort()[0];
    return $closest;   
}

基本上不同的是use ($number),您不需要命名 temp 函数。

于 2012-04-20T16:21:39.903 回答
3

作用域不像 JavaScript 那样工作。您不能简单地$number在回调函数内部引用,因为它没有范围链。

您要么必须使其成为全球性的(不推荐,但很简单):

<?php
function doFilter($element) { // this could still be anonymous, but doesn't have to be
   return $element - $GLOBALS['number'] >= 0;
}

function closeRoll( $number ) { 
   $GLOBALS['number'] = $number;
   $rollArray = Array(36, 48, 60, 72);
   $closest = array_filter( $rollArray, 'doFilter' );
   return $closest;   
};
?>

或者您可以使用use运算符(一个优雅的解决方案):

<?php

function closeRoll( $number ) { 
   $rollArray = Array(36, 48, 60, 72);
   $closest = array_filter( $rollArray, function( $element ) use ($number) {
     return $element - $number >= 0;
   });
   return $closest;   
};

?>
于 2012-04-20T16:28:26.990 回答
0

试试这个

function closeRoll($number) {
    $rollArray = array(36, 48, 60, 72);
    $closest = array_filter($rollArray, function ($rollArray) use ($number) { return $rollArray - $number >= 0; });

    if (!empty($closest))
    {
        sort($closest);
        return array_shift($closest);
    }
    return null;
}
于 2012-04-20T16:27:40.563 回答
0

因此,如果我正确理解 JavaScript,该函数会返回rollArray大于给定number参数的最接近匹配值吗?

这是我的解决方案:

function closeRoll($number) {
    $rollArray = array(36, 48, 60, 72);

    $rollArray = array_filter(
        $rollArray,
        function($value) use ($number) {
            return $value - $number >= 0;
        }   
    );  

    return reset(sort($rollArray));
}

使用array_filter()时,您走在正确的道路上。然而,当给它一个匿名函数作为回调时,你会遇到第一个 JavaScript 与 PHP 的问题——范围。

在 PHP 中,函数不会自动共享定义它们的范围。如果您需要使用当前范围内的某些内容,则需要使用 use 关键字随身携带。

最后我使用reset()来提取排序数组的第一个值,它应该是最接近的匹配值。您不能使用$rollArray[0],因为 array_filter() 保留键,因此0可能不再存在。

于 2012-04-20T16:43:19.650 回答
0

这是优化搜索的示例,不是直接的,而是使用您的大脑... :)

<?php

function find($number, array $a)
{
    $len = count($a);

    if ($len == 0)
    {
        return null;
    }
    elseif ($len == 1)
    {
        return array_shift($a);
    }

    sort($a, SORT_NUMERIC);

    $first  = array_slice($a, 0, (int) ($len / 2));
    $second = array_slice($a, (int) ($len / 2));

    // No need to check on isset because of if ($len == 0) elseif ($len == 1) 
    if ($second[0] == $number)
    {
        return $number;
    }

    $index = count($first) - 1;    
    if ($first[$index] == $number)
    {
        return $number;
    }

    return abs($number - $first[$index]) <= abs($number - $second[0]) ? find($number, $first) : find($number, $second);
}

$a = array(10, 99, 51, 201, 999, 500, 555, 618);
$n = 75;

echo find($n, $a);

?>
于 2012-04-20T16:46:18.570 回答