2010-05-17 4 views
48

तो हम PHP में इस समारोह मिलाstrcmp बराबर

strcmp(string $1,string $2) // returns -1,0, or 1; 

हम करते हैं लेकिन नहीं, एक intcmp (है); तो मैंने एक बनाया:

function intcmp($a,$b) { 
    if((int)$a == (int)$b)return 0; 
    if((int)$a > (int)$b)return 1; 
    if((int)$a < (int)$b)return -1; 
} 

यह सिर्फ गंदा लगता है। आप सब क्या सोचते हैं?

इस एक वर्ग में पारित एक आदेश मूल्य द्वारा Javascripts सॉर्ट करने के लिए का हिस्सा है।

class JS 
{ 
    // array('order'=>0,'path'=>'/js/somefile.js','attr'=>array()); 
    public $javascripts = array(); 
    ... 
    public function __toString() 
    { 
     uasort($this->javascripts,array($this,'sortScripts')); 
     return $this->render(); 
    } 
    private function sortScripts($a,$b) 
    { 
     if((int)$a['order'] == (int)$b['order']) return 0; 
     if((int)$a['order'] > (int)$b['order']) return 1; 
     if((int)$a['order'] < (int)$b['order']) return -1; 
    } 
    .... 
} 
+3

आप इस तरह के एक समारोह क्यों चाहिए ?? –

+0

हम एक उदाहरण पसंद करेंगे * क्यों * (हमें जिज्ञासा कहते हैं!)। – JYelton

+3

फिर आपको बस इसकी आवश्यकता है: 'sortScripts ($ a, $ b) {$ a- $ b वापसी; } ' आपको उलटा क्रम में सामान रखने के लिए केवल $ b- $ एक डालना होगा। –

उत्तर

81

क्रमबद्ध के साथ अपने डेटा:

function sortScripts($a, $b) 
{ 
    return $a['order'] - $b['order']; 
} 

उपयोग $ बी $ एक अगर तुम उलट क्रम चाहते हैं।

सवाल में संख्या PHP के पूर्णांक सीमा से अधिक है, return ($a < $b) ? -1 : (($a > $b) ? 1 : 0) और अधिक मजबूत है।

+1

मुझे रिवर्स ऑर्डर के लिए ($ b- $ a) * - 1 का उपयोग करना पड़ा। लेकिन मैं पीछे हटा। धन्यवाद! –

+1

हा! जिनियस! मैं बेवकूफ रूप से सामान्य 'वापसी ($ एक == $ बी) कर रहा था? 0: (($ a <$ b)? 1: -1); ' – Andris

+5

यह कार्यान्वयन [टूटा हुआ] (http://ideone.com/N5v06H) जैसा कि कई अन्य भाषाओं में है। – aioobe

3

मैं फोन नहीं होता यह गंदा दर असल, यह मान्य पर्याप्त लगता है। लेकिन मैं नहीं सोच सकता कि मैं उस समारोह का उपयोग कहां करूंगा। मेरी केवल सुझाव else शामिल करने के लिए हो सकता है:

function intcmp($a,$b) 
{ 
    if((int)$a == (int)$b)return 0; 
    else if((int)$a > (int)$b)return 1; 
    else if((int)$a < (int)$b)return -1; 
} 
1

एक नज़र में, हाँ यह गंदा लगता है। सिवाय वहाँ एक अच्छा कारण होगा आप ने लिखा है कि बजाय सिर्फ वास्तविक ==, >, और < ऑपरेटर्स का उपयोग कर की। इस समारोह को बनाने के लिए प्रेरणा क्या थी?

तो यह मेरे थे, मैं शायद वैसे ही जैसे कुछ करना चाहते हैं:

$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null)); 

मुझे पता है यह बस के रूप में बदसूरत है, और : null; - यकीन नहीं करता है, तो पीएचपी लिए ऐसा करना आवश्यक या अगर मैं कर सकता था :; लेकिन मैं इसे पसंद नहीं है और उस कोड वैसे भी अमल नहीं किया जाना चाहिए ... मुझे लगता है कि मैं बहुत कम इस बारे में उलझन में अगर मैं मूल आवश्यकताओं को पता था होगी!

+0

+1, यहां कोई प्रेरणा नहीं थी, 'intcmp' PHP में ज्यादा समझ नहीं लेता है। –

+0

@ एंडी ई का सिर: मैं अनुमान लगा रहा हूं * प्रेरणा एक ऐसा कार्य था जिसने 'strcmp' के समान परिणाम उत्पन्न किए थे, लेकिन मुझे उस परिदृश्य को समझना होगा जो उस विचार को जन्म देता है। – FrustratedWithFormsDesigner

+2

विचार जावास्क्रिप्ट बहु-आयामी सरणी की सरणी को क्रमबद्ध करने में सहायता करना था। –

10

आप

function intcmp($a,$b) 
    { 
    return ($a-$b) ? ($a-$b)/abs($a-$b) : 0; 
    } 

का उपयोग हालांकि मैं सब

+2

+1, चालाक! :-) – FrustratedWithFormsDesigner

+2

+1 miniaturization के लिए +1! – JYelton

+0

यह एक आकर्षण की तरह काम किया! क्या आपको लगता है कि यह कक्षा के संदर्भ में काम करता है? या बेहतर कार्यान्वयन होगा? मुझे अभी तक बहु-आयामी सरणी सॉर्ट करने के लिए एक अच्छा मानक नहीं मिला है !! –

3

में इस समारोह का उपयोग कर इसे +1 और -1 होना जरूरी है में बिंदु नहीं दिख रहा है हो सकता है? यदि नहीं, तो बस (int) $a - (int) $b लौटाएं। मुझे उस विभाजन को पसंद नहीं है जिसे किसी और ने सिफारिश की है, और सभी तीन मामलों की जांच करने की आवश्यकता नहीं है। यदि यह अधिक नहीं है और बराबर नहीं है, तो यह कम होना चाहिए।

return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1; 
+0

आईएमओ स्टैंकिंग टर्नरी ऑपरेटरों खराब अभ्यास है। इस मामले में, हमें संचालन के आदेश के साथ एक मुद्दा है। सुधार: वापसी (int) $ a> (int) $ b? 1: ((int) $ a == (int) $ b? 0: -1); – msun

+0

क्या PHP के पास ऑपरेटरों के सी से अलग ऑर्डर है? दुभाषिया अतिरिक्त कथन के बिना इस कथन का विश्लेषण कैसे करेगा? – tomlogic

+0

हां, PHP में टर्नरी ऑपरेटर साझेदारी टूट गई है: http://phpsadness.com/sad/30 – MazeChaZer

5

शुद्ध रूप से कुछ अतिरिक्त जानकारी के रूप में, वहाँ एक स्वीकार किए जाते हैं आरएफसी इस (https://wiki.php.net/rfc/combined-comparison-operator) के लिए किया गया है।

तो, तुलना समारोह की तर्ज पर होगा ...

<?php 
$data = [...]; 
usort($data, function($left, $right){ return $left <=> $right; }); 
?> 

कुछ वास्तव में अच्छा यहाँ विशेषता यह है कि तुलना अन्य सभी की तुलना के रूप में बिल्कुल उसी तरह किया जाता है। तो जॉगलिंग टाइप की उम्मीद के रूप में होगा।

अभी तक, किसी ऑब्जेक्ट को तुलना मूल्य का पर्दाफाश करने की अनुमति देने के लिए कोई जादू __forcompare() जैसी विधि नहीं है। वर्तमान प्रस्ताव (एक अलग आरएफसी) प्रत्येक ऑब्जेक्ट को तुलना के दौरान हर दूसरे ऑब्जेक्ट में इंजेक्शन दिया जाना चाहिए ताकि यह तुलना की जा सके - ऐसा कुछ जो मेरे लिए अजीब लगता है - रिकर्सन और स्टैक ओवरफ़्लो के लिए संभावित अवसर ...! मैंने या तो तुलना के लिए ऑब्जेक्ट के प्रकार को इंजेक्शन दिया होगा (किसी ऑब्जेक्ट को तुलना के प्रकार के आधार पर उपयुक्त मानों को प्रस्तुत करने की क्षमता प्रदान करने की अनुमति देता है) या तुलना के लिए ऑब्जेक्ट की सेवा के लिए एक अंधेरा अनुरोध, एक सुरक्षित होगा उपाय।

अभी तक PHP-NG (फिलहाल PHP 7) में एकीकृत नहीं है, लेकिन उम्मीद है कि जल्द ही होगा।

+0

येस, स्पेसशिप ऑपरेटर! – Owen

3

पहिया को पुनर्निर्मित क्यों करें? http://php.net/manual/en/function.strnatcmp.php

echo strnatcmp(1, 2) . PHP_EOL; // -1 
echo strnatcmp(10, 2) . PHP_EOL; // 1 
echo strnatcmp(10.5, 2) . PHP_EOL; // 1 - work with float numbers 
echo strnatcmp(1, -2) . PHP_EOL; // 1 - work with negative numbers 

टेस्ट इसे यहाँ: https://3v4l.org/pSANR

+0

इस उत्तर में इतने कम वोट क्यों हैं? –

+0

यह सभी मामलों के लिए भी काम करता है जब या तो केवल पहला या दूसरा पैरामीटर एक स्ट्रिंग होता है। – GreeKatrina

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

  • कोई संबंधित समस्या नहीं^_^