2012-04-20 315 views
8

我是PHP新手,我试图将简单的Javascript函数转换为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; 
}; 
+0

你需要数组排序? – Goldie 2012-04-20 16:11:46

+1

这是如何得到upvoted? -1在google中输入'php sort'会给出成千上万的结果。 – dm03514 2012-04-20 16:12:40

+0

你在排序什么? – 2012-04-20 16:13:56

回答

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; 
}; 

?> 
+0

+1 for'use' ... – 2012-04-20 17:27:55

+0

这对我来说很有效,我非常感谢你的帮助。我将学习和学习你的代码。谢谢。 – 2012-04-26 03:32:17

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)而你不知道不需要命名临时函数。

+0

我目前正在查找'use'的用法......我得到'意外的T_FUNCTION'错误。就像我说的,我是一个noob,所以我试图去掌握变量的范围。我认为,因为$ number和$ rollArray在另一个函数中的函数中,有些函数没有传递给过滤器函数..我很感谢大家的帮助! – 2012-04-20 16:43:12

+0

对于大数据行来说,没有必要制作一个array_filter,导致它遍历所有的数组,你不觉得使用某种已知算法更好吗? :) – devdRew 2012-04-20 16:52:16

+0

@JoeFisher如果你用这段代码得到'意外的T_FUNCTION',你可能在PHP <5.3。你需要使用'create_function()'这会让这个更有趣......尝试'function closeRoll($ number){$ rollArray = Array(36,48,60,72); $ nearest = array_filter($ rollArray,create_function('$ rollArray','return $ rollArray - '。$ number。'> = 0;'));返回$最接近; }' – DaveRandom 2012-04-20 17:18:09

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; 
} 
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 vs PHP问题 - 范围界定。

在PHP函数不会自动共享它们定义的范围。如果您需要使用currrent范围内的某些内容,则需要使用use关键字将它与您一起使用。

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

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); 

?>