মান দ্বারা বহুমাত্রিক অ্যারে বাছাই কিভাবে?


1128

"অর্ডার" কী এর মান দ্বারা আমি এই অ্যারেটিকে কীভাবে বাছাই করতে পারি? যদিও মানগুলি বর্তমানে ক্রমযুক্ত তবে সেগুলি সবসময় হয় না।

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )
)

1
ক্রস লিঙ্কযুক্ত: তথ্যসূত্র: পিএইচপি
তে

দ্রুততম উপায় হ'ল isomorphic সারণি -অ্যারে মডিউলটি যা ব্রাউজার এবং নোড উভয় ক্ষেত্রেই স্থানীয়ভাবে কাজ করে, যে কোনও ধরণের ইনপুট, গণিত ক্ষেত্র এবং কাস্টম সাজানোর আদেশকে সমর্থন করে।
লয়েড

উত্তর:


1728

একটি স্থলপথ চেষ্টা করে দেখুন , আপনি যদি এখনও পিএইচপি 5.2 বা তার বেশি আগে থেকে থাকেন তবে আপনাকে প্রথমে বাছাইয়ের ক্রিয়াটি সংজ্ঞায়িত করতে হবে:

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

usort($myArray, 'sortByOrder');

পিএইচপি 5.3 এ শুরু করে, আপনি একটি বেনামি ফাংশন ব্যবহার করতে পারেন:

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

এবং শেষ পর্যন্ত পিএইচপি 7 এর সাহায্যে আপনি স্পেসশিপ অপারেটরটি ব্যবহার করতে পারেন :

usort($myArray, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

এটি বহুমাত্রিক বাছাইয়ের ক্ষেত্রে প্রসারিত করতে, দ্বিতীয়টি / তৃতীয় বাছাইয়ের উপাদানগুলি উল্লেখ করুন যদি প্রথমটি শূন্য হয় - নীচে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে। আপনি এটি উপ-উপাদানগুলিতে বাছাইয়ের জন্যও ব্যবহার করতে পারেন।

usort($myArray, function($a, $b) {
    $retval = $a['order'] <=> $b['order'];
    if ($retval == 0) {
        $retval = $a['suborder'] <=> $b['suborder'];
        if ($retval == 0) {
            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
        }
    }
    return $retval;
});

আপনার যদি মূল সংস্থানগুলি বজায় রাখতে হয় তবে ব্যবহার করুন uasort()- ম্যানুয়ালটিতে অ্যারে বাছাইয়ের ক্রিয়াগুলির তুলনা দেখুন


2
আমার ফ্রেসিং কিছুটা বন্ধ, আমি এটি সম্পাদনা করব। আমার অর্থ হ'ল আপনি যদি পিএইচপি 5.3 এ না থাকেন তবে আপনাকে কেবল এই নির্দিষ্ট বাছাইয়ের জন্য একটি বিশেষ ফাংশন তৈরি করতে হবে (যা কোনওভাবে খুব মার্জিত নয়)। অন্যথায় আপনি ঠিক সেখানে একটি বেনামী ফাংশন ব্যবহার করতে পারেন।
খ্রিস্টান স্টাডার

23
@ জোনাথন: পিএইচপি করায় আপনি বেশিরভাগ কাজ সত্যই দেখতে পাচ্ছেন না। এটি অ্যারে নেয় এবং দুটি উপাদান দিয়ে শুরু হয়, যা এটি এই ব্যবহারকারীর সংজ্ঞায়িত ফাংশনে পৌঁছে। আপনার ফাংশনটি তখন তাদের তুলনা করার জন্য দায়ী: প্রথম উপাদানটি যদি দ্বিতীয়টির চেয়ে বড় হয় তবে একটি ধনাত্মক পূর্ণসংখ্যা ফেরত দিন, যদি এটি ছোট হয় তবে একটি নেতিবাচক ফিরিয়ে দিন। যদি তারা সমতুল্য হয়, তবে 0 ফিরে আসুন PH এখানে ফাংশনটি খুব সংক্ষিপ্ত, আপনি যদি পূর্ণসংখ্যার তুলনা না করে থাকেন তবে এটি আরও জটিল হতে পারে।
খ্রিস্টান স্টাডার

61
প্রতিলিপি: uasort()আপনি অ্যারে কীগুলি সংরক্ষণ করতে চান তবে ব্যবহার করুন ।
thaddeusmt

15
যদি বাছাইযোগ্য মানগুলি দশমিক সংখ্যা হয় তবে সাবধান হন। যদি বাছাইয়ের ফাংশনটি এর $ a = 1 এবং $ b = 0.1 হয় তবে পার্থক্যটি 0.9, তবে ফাংশনটি একটি int প্রদান করে, এই ক্ষেত্রে 0, সুতরাং $ a এবং $ b সমান হিসাবে বিবেচিত হবে এবং ভুলভাবে সাজানো হবে। এটি তুলনা করা আরও নির্ভরযোগ্য যদি equal a $ b বা সমানর চেয়ে বড় হয় এবং সেই অনুযায়ী -1, 1 বা 0 ফিরে আসে।
গ্রিনল্যান্ডি

37
এটি জানতে আমার কিছুটা সময় লেগেছে। বিপরীত অর্ডার (DESC) বাছাই করতে আপনি $ a এবং $ b স্যুইচ করতে পারেন। সুতরাং $ বি ['অর্ডার'] - $ এ ['আদেশ']
জানুলেম

285
function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"order");

7
@ Noc2spam আমি সাহায্য করতে পেরে আনন্দিত, তবে স্টুডারের পরামর্শ অনুসরণ করে বিবেচনা করুন যা সম্ভবত আরও দক্ষ এবং অবশ্যই আরও পরিচ্ছন্ন!
o0 '

1
@ লোরিস নিশ্চিত যে বাবু আমি এটিও পরীক্ষা করে দেখছি। গতকাল অফিসে আরও কঠিন দিন হত যদি আমি এই প্রশ্নটি না পাই :-)
গোগল

এইচএমএম একটি উত্তর যোগ করতে পারে না ... ভাল আমি এটি এখানে রেখেছি কোজগুলিকে আমার সেই মূ points় পয়েন্টগুলির দরকার নেই: সুতরাং বহুমাত্রিক আকারের জন্য এটির (প্রায়) একই জিনিসটি (আপনাকে পেস্টটি অনুলিপি করতে হবে এবং এটি পুনরায় ফর্ম্যাট করতে হবে): ফাংশন এ্যাসোর্ট (& $ অ্যারে , $ কী 1, $ কী 2, $ কী 3) {orter সার্টার = অ্যারে (); $ অবঃ = অ্যারের (); রিসেট ($ অ্যারে); foreach ($ ii => $ ভিএ হিসাবে অ্যারে) {orter সর্টর [$ ii] = getPrice ($ ভিএ [$ কী 1] [$ কী 2] [$ কী 3]); rs আর্সোর্ট (orter সর্ট); foreach ($ ii => $ va হিসাবে orter সাজানো) {$ ret [$ ii] = $ অ্যারে [$ ii]; ; $ অ্যারে = $ ret; }
Jaxx0rr

3
উপরের উত্তরের চেয়ে প্রয়োগ করা আরও সহজ
মার্সেল

1
তুমি অসাধারণ!! পিএইচপি AR.২ এর চর্চাকে খুব পছন্দ করে কাজ করে :) অনেক বেশি ধন্যবাদ জানায় :)
কমলেশ

270

আমি এই ফাংশনটি ব্যবহার করি:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key=> $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}


array_sort_by_column($array, 'order');

3
খুব ভাল কাজ করে। একটি অনন্য সমাধান একটি বাছাই দিক যোগ করতে সক্ষম হচ্ছে। ধন্যবাদ!
আইভো পেরেইরা

2
সাজানোর দিকনির্দেশ এবং প্রচুর অতিরিক্ত বৈশিষ্ট্যগুলিকে সমর্থন করে এমন বিকল্পের জন্য, আপনি আমার উত্তরটি এখানে একবার array_multisortখেয়াল করতে চাইতে পারেন - এটিরও সুবিধা রয়েছে যা এটি ব্যবহার করে না এবং এভাবে $sort_colসময় এবং স্মৃতিতে সঞ্চয় করার দরকার নেই ।
জন

আমার জন্য দুর্দান্ত কাজ করে, কিন্তু ... কেন &$arrকেবল ন্যায়বিচারের পরিবর্তে নির্দিষ্ট করা দরকার $arr?
রাদু মুর্জিয়া

2
@ রাদুমার্জিয়া তাই অ্যারেটি রেফারেন্স দিয়ে পাস হয়ে ফাংশনটি অনুলিপি করে ফাংশনটির একটি অনুলিপি গ্রহণের পরিবর্তে পরিবর্তিত হতে পারে
টম হাই হাই

1
@AdrianP। : অ্যারে রেফারেন্স দ্বারা পাস করা হয় তাই এটি একটি সাজানো অনুলিপি ফেরত না দিয়ে পাস করা অ্যারে সংশোধন করবে
টম হাই

72

আমি সাধারণত usort ব্যবহার করি , এবং আমার নিজস্ব তুলনা ফাংশনটি পাস করি। এই ক্ষেত্রে, এটি খুব সহজ:

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

স্পেসশিপ অপারেটর ব্যবহার করে পিএইচপি 7 এ:

usort($array, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

4
দাম্মি, আমি 30 সেকেন্ড ধীর ছিল। যদিও এটি $ a - $ b নয়?
খ্রিস্টান স্টাডার

3
আমি সবসময় এই ভুল পেতে। আমাকে ম্যানুয়াল থেকে ভাবতে দাও: প্রথম আর্গুমেন্টকে দ্বিতীয়টির চেয়ে কম মনে করা হলে রিটার্নের মানটি শূন্যের চেয়ে কম হওয়া উচিত। সুতরাং যদি $a['order']3 হয়, এবং $b['order']6 হয়, আমি -3 ফিরে আসব। সঠিক?
জান ফ্যাব্রি

3
ঠিক আছে, আপনি খ - ক ফিরে যান, সুতরাং এটি 3 হবে। এবং এইভাবে ভুলভাবে বাছাই।
খ্রিস্টান স্টাডার

26
আহ। ঠিক আছে. আমি অ-লজিকাল পাটিগণিত ব্যবহার করছিলাম, যেখানে আপনার মাথায় ধারণাটি আপনার উত্পাদিত শব্দের সাথে মেলে না। শুক্রবার দুপুরে এটি সবচেয়ে ঘন ঘন অধ্যয়ন করা হয়।
জান ফ্যাব্রি 21

কিছু ক্ষেত্রে উপরের উত্তরটি ভুল ফলাফল প্রত্যাবর্তন .. রেফারেন্স স্ট্যাকওভারফ্লো.com
বিলাল আহমেদ

45

এটি অর্জনের জন্য একটি পন্থা এরকম হবে

    $new = [
              [
                'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
                'title' => 'Flower',
                'order' => 3,
              ],

              [
                'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
                'title' => 'Free',
                'order' => 2,
              ],

              [
                'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
                'title' => 'Ready',
                'order' => 1,
              ],
    ];

    $keys = array_column($new, 'order');

    array_multisort($keys, SORT_ASC, $new);

    var_dump($new);

ফলাফল:

    Array
    (
        [0] => Array
            (
                [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
                [title] => Ready
                [order] => 1
            )

        [1] => Array
            (
                [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
                [title] => Free
                [order] => 2
            )

        [2] => Array
            (
                [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
                [title] => Flower
                [order] => 3
            )

    )

18

"শিরোনাম" কী ব্যবহারের মান অনুসারে অ্যারেটিকে সাজানোর জন্য:

uasort($myArray, function($a, $b) {
    return strcmp($a['title'], $b['title']);
});

strcmp স্ট্রিং তুলনা করুন।

uasort () অ্যারে কীগুলি যেমন সংজ্ঞায়িত করা হয়েছিল তেমন বজায় রাখে।



17
$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);

এটি উচ্চ এবং নিম্ন উভয় বর্ণমালার যত্ন নেয় takes


4
এটি কীভাবে নির্দিষ্ট অ্যারে কী দ্বারা বাছাইয়ের প্রশ্নের উত্তর দেয়?
Seano

12

ব্যবহার array_multisort(),array_map()

array_multisort(array_map(function($element) {
      return $element['order'];
  }, $array), SORT_ASC, $array);

print_r($array);

ডেমো


নোট করুন যে এই পদ্ধতির কোনও বিজ্ঞপ্তি প্রকাশ করবে। array_multisortএটি প্রথম প্যারামিটার রেফারেন্স।
কামি ইয়াং

5

সবচেয়ে নমনীয় পন্থা এই পদ্ধতি ব্যবহার করা হবে

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array

কারণটা এখানে:

  • আপনি যে কোনো একটি কি (এছাড়াও মত নেস্টেড দ্বারা বাছাই করতে পারেন 'key1.key2.key3'বা ['k1', 'k2', 'k3'])

  • মিশ্রণমূলক অ্যারে ( $assocপতাকা) নয় বরং উভয়ই সাহসী উপর কাজ করে

  • এটি রেফারেন্স ব্যবহার করে না - নতুন সাজানো অ্যারে ফিরিয়ে দেয়

আপনার ক্ষেত্রে এটি যেমন সহজ হবে:

$sortedArray = Arr::sortByKeys($array, 'order');

এই পদ্ধতিটি এই গ্রন্থাগারের একটি অংশ ।


1

আসুন এটির মুখোমুখি হন: প্রতিটি অ্যারে বাছাই করা দৃশ্য সঠিকভাবে পরিচালনা করার জন্য পিএইচপি-র বাক্সের কার্যকারিতা সহজ হয় না।

এই রুটিনটি স্বজ্ঞাত, যার অর্থ দ্রুত ডিবাগিং এবং রক্ষণাবেক্ষণ:

// automatic population of array
$tempArray = array();
$annotations = array();
// ... some code
// SQL $sql retrieves result array $result 
// $row[0] is the ID, but is populated out of order (comes from 
// multiple selects populating various dimensions for the same DATE 
// for example
while($row = mysql_fetch_array($result)) {
    $needle = $row[0];
    arrayIndexes($needle);  // create a parallel array with IDs only
    $annotations[$needle]['someDimension'] = $row[1]; // whatever
}
asort($tempArray);
foreach ($tempArray as $arrayKey) {
    $dataInOrder = $annotations[$arrayKey]['someDimension']; 
    // .... more code
}

function arrayIndexes ($needle) {
    global $tempArray;
    if (!in_array($needle,$tempArray)) {
        array_push($tempArray,$needle);
    }
}

4
"আসুন এটির মুখোমুখি করুন: প্রতিটি অ্যারে বাছাই করা দৃশ্য সঠিকভাবে পরিচালনা করার জন্য পিএইচপি-র বাক্সের কার্যকারিতা থেকে সরল কিছু নেই" " ঠিক এটাই কি usort / ksort / asort ^^ 'এর জন্য ডিজাইন করা হয়েছে
বেন ক্যাসিনাত

3
আসলে পিএইচপি হয়েছে বাছাই ফাংশন অনেক যে প্রতি অ্যারের সাজানোর দৃশ্যকল্প হ্যান্ডেল করতে ব্যবহার করা যাবে।
axiac

ডিবাগিং এবং রক্ষণাবেক্ষণের ক্ষেত্রে, এর ব্যবহার globalএকটি বিশাল লাল পতাকা এবং সাধারণত নিরুৎসাহিত করা হয়mysql_fetch_arrayওপি'র উত্স অ্যারের পরিবর্তে এই প্রশ্নের জন্য কেন প্রদর্শিত হচ্ছে এবং আপনার কোডটি কী করছে এবং ফলাফল কী হতে পারে বলে আশা করা যায় তার কোনও ব্যাখ্যা নেই? সামগ্রিকভাবে এটি কাঙ্ক্ষিত শেষ ফলাফল অর্জন করার জন্য একটি খুব জটিল পদ্ধতি।
fyrye

@ ট্যানজিগিল আপনার উত্তর এবং ওপি'র ডেটাসেট থেকে আপনার প্রত্যাশিত ফলাফলগুলি আমি নির্ধারণ করতে সক্ষম নই। এটি আপনার কাছে সুস্পষ্ট হতে পারে তবে আপনার উত্তর কীভাবে ওপি-র প্রশ্নের উত্তর দেয় তা আমি জানি না। তবে, আপনি দেখুন পরিবর্তে বাই-রেফারেন্সটি পাস করতে পারবেন global: 3v4l.org/FEeFC এটি বিশ্বব্যাপী পরিবর্তন ও অ্যাক্সেসযোগ্য একের পরিবর্তে একটি স্পষ্টভাবে সংজ্ঞায়িত ভেরিয়েবল তৈরি করে।
fyrye

0

আপনি যেমন একাধিক মানের জন্য বহুমাত্রিক অ্যারে বাছাই করতে পারেন

$arr = [
    [
        "name"=> "Sally",
        "nick_name"=> "sal",
        "availability"=> "0",
        "is_fav"=> "0"
    ],
    [
        "name"=> "David",
        "nick_name"=> "dav07",
        "availability"=> "0",
        "is_fav"=> "1"
    ],
    [
        "name"=> "Zen",
        "nick_name"=> "zen",
        "availability"=> "1",
        "is_fav"=> "0"
    ],
    [
        "name"=> "Jackson",
        "nick_name"=> "jack",
        "availability"=> "1",
        "is_fav"=> "1"
    ],
    [
        "name"=> "Rohit",
        "nick_name"=> "rod",
        "availability"=> "0",
        "is_fav"=> "0"
    ],

];

সঙ্গে

usort($arr,function($a,$b){
    $c = $b['is_fav'] - $a['is_fav'];
    $c .= $b['availability'] - $a['availability'];
    $c .= strcmp($a['nick_name'],$b['nick_name']);
    return $c;
});

আউটপুট ব্যবহার করে print_r($arr):

Array
(
    [0] => Array
        (
            [name] => Jackson
            [nick_name] => jack
            [availability] => 1
            [is_fav] => 1
        )

    [1] => Array
        (
            [name] => David
            [nick_name] => dav07
            [availability] => 0
            [is_fav] => 1
        )

    [2] => Array
        (
            [name] => Zen
            [nick_name] => zen
            [availability] => 1
            [is_fav] => 0
        )

    [3] => Array
        (
            [name] => Rohit
            [nick_name] => rod
            [availability] => 0
            [is_fav] => 0
        )

    [4] => Array
        (
            [name] => Sally
            [nick_name] => sal
            [availability] => 0
            [is_fav] => 0
        )

)

পিএস) স্ট্রিংগুলির সাথে তুলনা করার জন্য স্ট্রিম্প ব্যবহার করা ভাল বিকল্প হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.