मैं एक सतत कुंजी के आधार पर एक बहुआयामी सरणी मान को सॉर्ट करने का प्रयास कर रहा हूं। मेरी सरणी कुछ इसी तरह दिखती है और जिस कुंजी को मैं क्रम में क्रमबद्ध करना चाहता हूं वह discipline_one है।

$data = [
    [
        'id' => 1,
        'score' => 200,
        'results' => [
            'discipline_one' => "4:01"
        ],
    ],
    [
        'id' => 2,
        'score' => 250,
        'results' => [
            'discipline_one' => "3:50"
        ],
    ],
    [
        'id' => 3,
        'score' => 284,
        'results' => [
            'discipline_one' => "3:42"
        ],
    ],
    [
        'id' => 4,
        'score' => 300,
        'results' => [
            'discipline_one' => "4:27"
        ],
    ],
];

उपरोक्त उदाहरण में id कुंजी को छोड़कर, मेरा अपेक्षित आउटपुट क्रम में होगा:

3, 2, 1, 4

पहले, score पर आधारित क्वेरी के लिए मैंने इस्तेमाल किया:

array_multisort(array_column($data, 'score'), SORT_DESC, $data);

हालांकि, अगर मैं इस पर discipline_one कंसिस्टेंट कुंजी के लिए एक अतिरिक्त array_column जोड़ता हूं तो मुझे समझ आ गया:

array_multisort(array_column(array_column($data, 'result'), 'discipline_one'), SORT_DESC, $data);

array_multisort (): सरणी आकार असंगत हैं

तीसरा तर्क उसी सरणी की अपेक्षा करता है जो इस मामले में संभव नहीं है। क्या किसी को यह पता है कि मैं इसे कैसे हासिल कर सकता हूं?

-1
Jaquarh 27 नवम्बर 2021, 12:12
आपके एरे में एक कॉलम 'results' है और कॉलम निकालने के लिए आपके कोड में 'result' है।
 – 
Nigel Ren
27 नवम्बर 2021, 12:18
यह सच है, मैंने इसे अपने वास्तविक डेटा से SO के लिए अधिक सीमित वातावरण में स्थानांतरित कर दिया, इसलिए मैंने एक टाइपो का उत्पादन किया। विधि अभी भी समस्या उत्पन्न करती है और काम नहीं करती है इसलिए नहीं, यह समस्या अभी भी प्रतिलिपि प्रस्तुत करने योग्य है और केवल एक टाइपो के कारण नहीं थी। @निगेलरेन
 – 
Jaquarh
27 नवम्बर 2021, 12:27
मैंने अभी-अभी 'परिणाम' वाले कोड की कोशिश की है और मुझे वह ऑर्डर मिला है जिसकी मुझे उम्मीद थी - 4, 1, 2, 3
 – 
Nigel Ren
27 नवम्बर 2021, 12:32
स्वीकृत उत्तर को समान मानों के साथ आज़माएं! आप तार की तुलना कर रहे हैं, समय की नहीं।
 – 
Nigel Ren
27 नवम्बर 2021, 12:36

1 उत्तर

सबसे बढ़िया उत्तर

साधारण usort का उपयोग क्यों नहीं कर रहे हैं?

usort($data, fn($a, $b) => ($a['results']['discipline_one'] <=> $b['results']['discipline_one']) * -1);
2
Justinas 27 नवम्बर 2021, 12:20
त्वरित प्रतिक्रिया के लिए धन्यवाद। मैं वास्तव में इसकी सराहना करता हूं, मैंने निश्चित रूप से इस पर गौर करने से पहले <=> नहीं देखा है! समय आने पर मैं इस उत्तर को स्वीकार कर लूंगा।
 – 
Jaquarh
27 नवम्बर 2021, 12:20
यह spaceship operator है, लेकिन आप किसी भी प्रकार के फ़ंक्शन में 0 से नीचे, 0 या 0 से ऊपर कोई भी नंबर वापस कर सकते हैं
 – 
Justinas
27 नवम्बर 2021, 12:21
बड़े डेटा का परीक्षण करते हुए, मैं यह भी देखता हूं कि मेरे पास समस्या यह है कि यह : के कारण एक स्ट्रिंग है, इसलिए 1:55 और 11:55 के साथ काम करते समय तुलना बहुत अजीब है। यह 1:55 से पहले 11:55 दिखाता है, इसलिए मैं : को हटा दूंगा और जाँच से पहले पूर्णांक में बदल दूंगा।
 – 
Jaquarh
27 नवम्बर 2021, 12:33
यदि आप $a और $b राउंड की अदला-बदली करते हैं तो आप * -1 का उपयोग करने से बच सकते हैं
 – 
Nigel Ren
27 नवम्बर 2021, 12:37