2012-04-20 19 views
8

में जावास्क्रिप्ट फ़ंक्शन को कनवर्ट करना मैं PHP के लिए नया हूं और मैं एक साधारण जावास्क्रिप्ट फ़ंक्शन को PHP फ़ंक्शन में कनवर्ट करने का प्रयास कर रहा हूं। अब तक मैं केवल चर को परिवर्तित करने के बारे में जानता हूं, मुझे सॉर्ट फ़ंक्शन और सरणी फ़िल्टर के साथ सहायता चाहिए। किसी भी मदद के लिए धन्यवाद!एक 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

+1

यह कैसे उठाया गया? Google में 'php sort' में टाइपिंग हजारों परिणाम देगा। – dm03514

+0

आप किस पर सॉर्ट कर रहे हैं? –

उत्तर

3

Scoping का प्रयास करें; आप अपने कॉलबैक फ़ंक्शन के अंदर बस $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 के लिए तैयार हूं ... –

+0

यह मेरे लिए काम करता है, मैं इसके साथ आपकी मदद की सराहना करता हूं। मैं आपके कोड से अध्ययन और सीखूंगा। धन्यवाद। –

3

आप बहुत करीब हैं, पीएचपी में चर गुंजाइश थोड़ा अलग है:

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) है और आप डॉन ' tem temp फ़ंक्शन का नाम देने की आवश्यकता नहीं है।

+0

मैं वर्तमान में 'उपयोग' के उपयोग को देख रहा हूं ... मुझे 'एक अप्रत्याशित T_FUNCTION' त्रुटि मिल रही है। जैसे मैंने कहा, मैं एक नोब हूं इसलिए मैं परिवर्तनीय दायरे पर समझ पाने की कोशिश कर रहा हूं। मुझे लगता है क्योंकि $$ और $ rollArray किसी अन्य फ़ंक्शन के भीतर फ़ंक्शन में हैं, कुछ फ़िल्टर फ़ंक्शन पर कैसे नहीं जा रहे हैं .. मैं हर किसी की मदद की सराहना करता हूं! –

+0

एक बड़ी डेटा पंक्तियों के लिए एक array_filter बनाने के लिए आवश्यक नहीं है, क्योंकि यह सभी सरणी के माध्यम से जाता है, क्या आपको नहीं लगता कि किसी प्रकार के सुंदर ज्ञात एल्गोरिदम का उपयोग करना बेहतर है? :) – devdRew

+0

@ जोफिशर अगर आपको इस कोड के साथ 'अप्रत्याशित T_FUNCTION' मिल रहा है, तो आप शायद PHP <5.3 पर हैं। आपको 'create_function()' का उपयोग करने की आवश्यकता होगी जो इसे और अधिक रोचक बनाने जा रहा है ... 'फ़ंक्शन क्लोज़ रोल ($ संख्या) {$ rollArray = Array (36, 48, 60, 72); $ निकटतम = array_filter ($ rollArray, create_function ('$ rollArray', 'वापसी $ rollArray -'। $ संख्या। '> = 0;')); $ निकटतम वापसी; } ' – DaveRandom

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

तो अगर मैं समझता हूँ

आप या तो इसे बनाने के लिए वैश्विक (अनुशंसित नहीं लेकिन सरल) है जावास्क्रिप्ट सही ढंग से, यह फ़ंक्शन 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() का उपयोग कर आप सही रास्ते पर कर रहे हैं:

यहाँ यह करने के लिए अपने समाधान है। हालांकि जब इसे कॉलबैक के रूप में अज्ञात फ़ंक्शन दिया जाता है तो आप पहली जावास्क्रिप्ट बनाम PHP समस्या - स्कॉइंग में कूद रहे हैं।

PHP फ़ंक्शंस में स्वचालित रूप से उस क्षेत्र को साझा नहीं किया जाता है जहां उन्हें परिभाषित किया जाता है। यदि आपको कर्सर स्कोप से कुछ उपयोग करने की आवश्यकता है तो आपको उपयोग कीवर्ड का उपयोग करके इसे अपने साथ लाने की आवश्यकता है।

अंतिम मैं सॉर्ट किए गए सरणी के पहले मान को खींचने के लिए 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); 

?> 
संबंधित मुद्दे