2013-06-24 10 views
6

शामिल मैं निम्नलिखित तार है इस प्रकार है:पीएचपी स्ट्रिंग पूर्णांक

1BG200,1M400,1BA1000 

और मैं वर्णन आदेश में उपरोक्त तार तुलना करने के लिए करना चाहते हैं ...

कोड:

$sql = "SELECT * FROM collected WHERE c_no BETWEEN '".$from."' AND '".$to."' ORDER BY c_no Desc"; 

आउटपुट:

1M400 
1BG200 
1BA1000 

यह 1000 होना चाहिए, फिर 400, 200.. मैं उनकी तुलना कैसे कर सकता हूं? मेरा मानना ​​है कि स्ट्रिंग की तुलना करने का अधिकार नहीं है जिसमें पूर्णांक है! और मुझे अपने मुद्दे के लिए सही समाधान नहीं मिल रहा है?

कुछ लोगों ने preg_match या substr का उपयोग करने का सुझाव दिया .. लेकिन जैसा कि आप देख सकते हैं कि सिंगल और डबल अक्षर पूर्व (एम और बीजी) हैं।

क्षमा करें, मैं PHP से परिचित नहीं हूं .. कृपया मदद करें!

+0

तो, छँटाई एल्गोरिथ्म के लिए केवल निर्भर हिस्सा अंत है अंक अनुक्रम? – Daniel

+0

@ डैनियल वैसे मैं पूरी स्ट्रिंग की तुलना करना चाहता था, लेकिन ऐसा लगता है कि यह मेरे साथ काम नहीं कर रहा है। तो हाँ, मैं अक्षरों को अनदेखा करना और अंक अनुक्रम को सॉर्ट करना चाहता हूं। – Alihamra

उत्तर

3

आप केवल संख्यात्मक हिस्सा

function cmp($a, $b) 
{ 
    $numa = intval(preg_replace('/[0-9]*[A-Z]+/', '', $a)); 
    $numb = intval(preg_replace('/[0-9]*[A-Z]+/', '', $b)); 
    if($a == $b) return 0; 
    return ($a < $b) ? -1 : 1; 
} 

//Now get the list and sort 
usort($list, "cmp"); 
+2

इसके अलावा यदि आप चाहते हैं कि अग्रणी अंक सॉर्टिंग एल्गोरिदम का हिस्सा हो, साथ ही आप '"/ [^ 0-9] /" 'के लिए पैटर्न का आदान-प्रदान करेंगे जो सभी अंकों पर सॉर्टिंग का आधार करेगा। सॉर्टिंग कॉलम के लिए – Daniel

2

आप पहले नंबर को हटाने के लिए preg_replace('/[0-9][A-Z]+/', '', $var) का उपयोग कर सकते हैं और उसके बाद एक अक्षर और उसके बाद PHP usort का उपयोग कर सकते हैं।

0

आप अपने mysql (https://github.com/mysqludf/lib_mysqludf_preg) के लिए उपयोगकर्ता परिभाषित preg-कार्यों जोड़ सकता है पर देख रहे हैं, एक कस्टम तरह उपयोग कर सकते हैं। फिर क्लॉज द्वारा अपने ऑर्डर में PREG_CAPTURE का उपयोग करें।

1

आप अपने MySQL पर एक कस्टम फ़ंक्शन जोड़ सकते हैं। ऐसा लगता है कि ऐसा लगता है कि यह सभी गैर अंकों के पात्र MySQL strip non-numeric characters to compare को हटा सकता है।

मैं सब कुछ वापस लाने के लिए यह करने की अत्यधिक अनुशंसा करता हूं कि अगर आप कभी भी बड़े परिणामों को वापस लौटने के कारण सीमा/ऑफसेट का उपयोग करने का निर्णय लेते हैं। अन्यथा आपको सब कुछ वापस PHP पर खींचना होगा, फिर एक सरणी को विभाजित करना होगा, जिस बिंदु पर मुझे लगता है कि यह संसाधनों का अक्षम उपयोग होगा।

वैकल्पिक रूप से, यदि आप एक व्यवहार्य विकल्प है, तो आप मेरी तालिका में एक प्रकार का कॉलम जोड़ सकते हैं, जिससे आप MySQL में इंडेक्स का बेहतर उपयोग कर सकें, जो आपके रिकॉर्ड सेट के आधार पर एक बड़ा प्रदर्शन अंतर हो सकता है।

+0

+1 –

0

सामान्य प्रीग में महंगा है। दिए गए पैटर्न से एक नंबर हासिल करने के लिए मैं कुछ इस तरह करना होगा:

digitstri='1M400'; // just an example 
number=intval(is_number(digitstri{2})?substr(digitstri,2):substr(digitstri,3)) 

मुझे लगता है कि, छंटाई से वहाँ स्पष्ट है ...

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