我是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;
};
作用域不像 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;
};
?>
你已经很接近了,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)
,您不需要命名临时函数。
试试这个
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;
}
因此,如果我正确理解 JavaScript,该函数将返回大于给定number
参数的最接近rollArray
匹配值?
这是我的解决方案:
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
可能不再存在。
这是优化搜索的示例,不是直接的,而是使用你的大脑...... :)
<?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);
?>