[英]Converting Javascript function into a PHP function
我是PHP的新手,我正在嘗試將簡單的Javascript函數轉換為PHP函數。 到目前為止,我知道只轉換變量,我需要幫助sort函數和數組過濾器。 謝謝你的幫助!
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;
};
你非常接近,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函數。
范圍界定與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;
};
?>
試試這個
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,那么該函數會返回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 vs PHP問題 - 范圍。
在PHP中,函數不會自動共享定義它們的范圍。 如果你需要使用currrent范圍內的東西,你需要使用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);
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.