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

したがって、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

これを試して

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

これは、まっすぐではなく、頭脳を使用して検索を最適化する例です... :)

<?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 に答える