পিএইচপি-তে কোনও প্রদত্ত কীটির মান অনুসারে সাহসী অ্যারেগুলির একটি অ্যারে বাছাই কিভাবে?


446

এই অ্যারে দেওয়া:

$inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),

);

আমি $inventoryদাম পেতে এর উপাদানগুলি বাছাই করতে চাই :

$inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),

);

কিভাবে আমি এটি করতে পারব?


উত্তর:


606

আপনি ঠিক বলেছেন, আপনি যে ফাংশনটি সন্ধান করছেন তা হ'ল array_multisort()

ম্যানুয়াল থেকে সরাসরি নেওয়া এবং আপনার ক্ষেত্রে খাপ খাইয়ে নেওয়া এখানে একটি উদাহরণ রয়েছে:

$price = array();
foreach ($inventory as $key => $row)
{
    $price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);

পিএইচপি 5.5.0 হিসাবে আপনি সেই পূর্বাভাসের পরিবর্তে অ্যারে_ কলাম () ব্যবহার করতে পারেন

$price = array_column($inventory, 'price');

array_multisort($price, SORT_DESC, $inventory);

5
যদিও এটি বিকল্পগুলির চেয়ে অবশ্যই বেশি ব্যয়বহুল।
ম্যাট

5
অনেক বেশী ব্যাবহুল? এটি অদ্ভুত, আমার মেশিনে (পিএইচপি 5.3.1-দেব চালানো) অ্যারে_মলটিসোর্ট () ছোট অ্যারেগুলিতে কয়েক শতাংশ দ্রুত এবং বড় অ্যারেগুলিতে 100 গুণ দ্রুত (100+ উপাদান) দ্রুত
জোশ ডেভিস

3
সংখ্যার কীগুলি নিয়ে কাজ করার জন্য এটি কোনও পরিবর্তনের প্রয়োজন হবে না। আপনি যদি সংখ্যার কীগুলির সাথে সম্পর্কিত কোনও বাগ বা অদ্ভুত আচরণটি মারছেন তবে এটি একটি নতুন প্রশ্ন হিসাবে পোস্ট করুন।
জোশ ডেভিস

4
অ্যারে_মল্টিসোর্টের একটি বড় সমস্যা রয়েছে: এটি মূল কীটি বজায় রাখে না।
মেশিন্যাডিক্ট

1
@ মেশিনেডিক্ট এটি মিশ্রিত কীগুলি বজায় রাখে।
মতেজ স্বাভাজার

318

পিএইচপি 7+

পিএইচপি 7 হিসাবে, এটি অজ্ঞাতusort কোনও ফাংশন দিয়ে সংক্ষিপ্তভাবে করা যেতে পারে যা স্পেসশিপ অপারেটরকে উপাদানগুলির সাথে তুলনা করতে ব্যবহার করে ।

আপনি এটির মতো আরোহী বাছাই করতে পারেন:

usort($inventory, function ($item1, $item2) {
    return $item1['price'] <=> $item2['price'];
});

বা এর মতো একটি উতরিত বাছাই:

usort($inventory, function ($item1, $item2) {
    return $item2['price'] <=> $item1['price'];
});

এটি কীভাবে কাজ করে তা বোঝার জন্য, নোটটি usortব্যবহারকারীর দ্বারা সরবরাহিত তুলনা ফাংশন গ্রহণ করে যা অবশ্যই নীচে আচরণ করবে (ডক্স থেকে):

তুলনা ফাংশনটি অবশ্যই প্রথম সংখ্যাকে যথাক্রমে কম, সমান বা দ্বিতীয়টির চেয়ে বড় হিসাবে বিবেচনা করা হলে শূন্যের চেয়ে কম, সমান বা বৃহত্তর অবশ্যই প্রদান করবে।

এবং আরও মনে রাখবেন যে <=>, স্পেসশিপ অপারেটর,

উভয় অপারেন্ড সমান হলে 0, বাম বড় হলে 1 এবং ডান বড় হলে -1 প্রদান করে returns

যা ঠিক তাই usortপ্রয়োজন। প্রকৃতপক্ষে, https://wiki.php.net/rfc/combined-compistance-operator<=> এ ভাষা যুক্ত করার জন্য প্রায় সম্পূর্ণ ন্যায্যতা এটি

usort()সহজ সঙ্গে ব্যবহারের জন্য কলিং অর্ডার কলব্যাক করে তোলে


পিএইচপি 5.3+

পিএইচপি 5.3 বেনামে ফাংশন চালু করেছে, তবে এখনও স্পেসশিপ অপারেটর নেই। আমরা এখনও usortআমাদের অ্যারে বাছাই করতে ব্যবহার করতে পারি , তবে এটি আরও কিছুটা ভার্বোজ এবং বুঝতে আরও শক্ত:

usort($inventory, function ($item1, $item2) {
    if ($item1['price'] == $item2['price']) return 0;
    return $item1['price'] < $item2['price'] ? -1 : 1;
});

মনে রাখবেন যে পূর্ণসংখ্যার মানগুলির সাথে লেনদেনকারী তুলনাকারীদের পক্ষে মানগুলির পার্থক্যটি ফিরিয়ে আনার পক্ষে এটি মোটামুটি সাধারণ, যেমন $item2['price'] - $item1['price'], আমরা এই ক্ষেত্রে নিরাপদে এটি করতে পারি না । এটি কারণ প্রশ্নকারীদের উদাহরণগুলিতে দামগুলি ভাসমান পয়েন্ট সংখ্যাগুলি রয়েছে তবে আমরা তুলনা ফাংশনটি পাস করি যাতে সঠিকভাবে কাজ করার usortজন্য পূর্ণসংখ্যা ফিরে আসতে usortহয়:

তুলনা ফাংশন, যেমন ফ্লোট থেকে অ-পূর্ণসংখ্যার মানগুলি ফেরত দেওয়ার ফলে কলব্যাকের ফেরতের মানটির পূর্ণসংখ্যার অভ্যন্তরীণ কাস্ট হবে। সুতরাং ০.৯৯ এবং ০.০ এর মতো মানগুলি উভয়কেই 0 এর পূর্ণসংখ্যার মান হিসাবে ফেলে দেওয়া হবে যা এই জাতীয় মানকে সমান হিসাবে তুলনা করবে।

usortপিএইচপি 5.x ব্যবহার করার সময় এটি মনে রাখার একটি গুরুত্বপূর্ণ ফাঁদ ! আমার এই উত্তরের মূল সংস্করণটি এই ভুল করেছে এবং তবুও আমি গুরুতর ত্রুটি না দেখে কারও কাছে দৃশ্যত কয়েক হাজার ভিউ ধরে দশটি আপগ্রেট অর্জন করেছি। স্বচ্ছন্দে সঙ্গে যা lackwits মত আমার comparator ফাংশন স্ক্রু আপ করতে পারেন অবিকল কারণ সহজ-থেকে-ব্যবহার মহাকাশযান অপারেটর পিএইচপি 7 ভাষা যোগ করা হয়েছিল।


8
দুঃখিত, তবে এই পদ্ধতিটি সহযোগী অ্যারে থেকে স্ট্রিং কীগুলি মুছে ফেলে। পরিবর্তে "uasort" ফাংশনটি ব্যবহার করা উচিত।
মাত্তিও-সফটনেট

8
@ ডটম্যাট আকর্ষণীয় - আমি এটি সম্পর্কে জানতাম না uasort। দস্তাবেজগুলি দেখার পরে, যদিও এই ক্ষেত্রে এই উত্তরটি এখনও সঠিক । ওপি-র উদাহরণে, সাজানো অ্যারের স্ট্রিং সূচকগুলির চেয়ে ক্রমিক সংখ্যাযুক্ত সূচক রয়েছে, সুতরাং usortএটি আরও উপযুক্ত। uasortধারাবাহিক-সূচকযুক্ত অ্যারে ব্যবহার করার ফলে একটি সাজানো অ্যারে তৈরি হবে যা এর সংখ্যাসূচক সূচকগুলির দ্বারা অর্ডার করা হয়নি, যেমন foreachলুপে দেখা প্রথম উপাদানটি নয় $your_array[0], যা পছন্দসই আচরণের সম্ভাবনা নয় is
মার্ক অ্যামেরি

100

যদিও অন্যরা সঠিকভাবে ব্যবহারের পরামর্শ দিয়েছেন array_multisort(), কোনও কারণে কোনও উত্তর অস্তিত্বের স্বীকৃতি দেয় বলে মনে হয় array_column()না, যা সমাধানটি ব্যাপকভাবে সরল করতে পারে। সুতরাং আমার পরামর্শটি হবে:

array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);

1
কোনও কারণে আমি নিম্ন / উপরের বর্ণের স্ট্রিং দিয়ে এটি কাজ করতে সক্ষম হইনি। এমনকি SORT_FLAG_CASE ব্যবহার করে। নিম্নলিখিতটি আমার জন্য স্ট্রিং তুলনার জন্য কাজ করেছে: অ্যারে_মল্টিসোর্ট (অ্যারে_ম্যাপ (স্ট্রোলটার, অ্যারে_ কলাম ($ আইপিআর_প্রজেক্টস, 'নাম')), এসওআরএসএএসসি, ip আইপিআর_প্রজেক্টস);
পাবামাটো

8
এটি সবচেয়ে মার্জিত উত্তর। অনেক বেশি রেট দেওয়া উচিত!
আরমিন হিয়ারস্টেটার

3
সবচেয়ে স্বল্পতম এবং সহজতম, আমার মতে একটি গ্রহণ করেছেন
স্টুডিওক্স

1
এখানে ভাল জিনিস। আমার জন্য নিখুঁতভাবে কাজ করেছেন!
ফান ডক


42

যেহেতু আপনার অ্যারে উপাদানগুলি স্ট্রিং কীগুলির সাথে নিজেকে বিন্যাস করে, তাই আপনার সেরা বেটটি একটি কাস্টম তুলনা ফাংশনটি সংজ্ঞায়িত করা। এটি করা বেশ দ্রুত এবং সহজ। এটা চেষ্টা কর:

function invenDescSort($item1,$item2)
{
    if ($item1['price'] == $item2['price']) return 0;
    return ($item1['price'] < $item2['price']) ? 1 : -1;
}
usort($inventory,'invenDescSort');
print_r($inventory);

নিম্নলিখিত উত্পাদন করে:

Array
(
    [0] => Array
        (
            [type] => pork
            [price] => 5.43
        )

    [1] => Array
        (
            [type] => fruit
            [price] => 3.5
        )

    [2] => Array
        (
            [type] => milk
            [price] => 2.9
        )

)

4
এখানে অন্যান্য কয়েকটি মন্তব্যের সাথে একত্রিত (uasort এবং ইনলাইন বেনামে ফাংশন), আপনি এই ওয়ান-লাইনারটি পান:uasort( $inventory, function ($a, $b) { if ( $a==$b ) return 0; else return ($a > $b) ? -1 : 1; });
অ্যালান পোর্টার

অনুক্রমিক সংখ্যা কীগুলির সাথে অ্যারে বাছাই করার usortচেয়ে @ অ্যালান্পোর্টার আরও উপযুক্ত বলে মনে uasortকরছেন। একটি অ্যারের সাথে সমাপ্তি যেখানে প্রথম উপাদানটি সূচকে থাকে 1এবং দ্বিতীয় উপাদানটি সূচকে থাকে 0এমন ব্যক্তিদের জন্য একটি বিস্ময়কর আচরণ এবং যারা পিএইচপি'র অ্যারের বিশদগুলির সাথে পরিচিত নয় তাদের জন্য একটি নিশ্চিত ফাঁদ; usortআপনি স্বজ্ঞাতভাবে আশা করতে পারেন আউটপুট দেয়।
মার্ক অ্যামেরি

25

আমি এটির উপর শেষ করেছি:

function sort_array_of_array(&$array, $subfield)
{
    $sortarray = array();
    foreach ($array as $key => $row)
    {
        $sortarray[$key] = $row[$subfield];
    }

    array_multisort($sortarray, SORT_ASC, $array);
}

অ্যারে এবং দ্বিতীয় স্তরের অ্যারের ক্ষেত্রের নামটি অতিক্রম করে কেবল ফাংশনটি কল করুন। ভালো লেগেছে:

sort_array_of_array($inventory, 'price');

1
হা! আমি ঠিক ঠিক একই জিনিসটি তৈরি করেছি এবং পোস্টটি করছিলাম কিন্তু আপনার ... দেখেছি oted
রব ইভান্স

1
ডাউনভোটিং কারণ জোশ ডেভিস কয়েক বছর আগে পোস্ট করেছিলেন এটি ঠিক একই সমাধান।
মার্ক আমেরিকা

অসম্মতি ... আমি বলিনি এটি একটি ভিন্ন সমাধান, আমি কেবল বলেছিলাম যে আমি এই সমাধানটি দিয়ে শেষ করেছি এবং একটি সম্পূর্ণ কার্যকরী ফাংশন দেব।
ড্যানিয়েলজ্ট

1
@ মার্কআমেরি আমি ফাংশনগুলিতে থাকা উত্তরগুলি পছন্দ করি। এটি অনুলিপি পোস্টকারীদের ফাংশনগুলি ব্যবহার করতে উত্সাহ দেয় এবং আশা করি কম স্প্যাগেটি কোড লিখবেন।
হংস

19

আপনি usortবেনামে ফাংশন ব্যবহার করতে পারেন , যেমন

usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });

সংস্করণ পিএইচপি 5> = 5.5.0, পিএইচপি 7 আপনার মতো আমার জন্য যারা সত্যই তাদের জন্য এটি কাজ করতে চেয়েছিলেন ..
ম্যাট পি

1
লক্ষণীয় যে strnatcmp, স্ট্রিং তুলনা করার জন্য বোঝানো এখানে দুর্দান্ত কাজ করে। স্পষ্টতই এটি প্রয়োগ করে "প্রাকৃতিক আদেশ" এর মধ্যে সংক্ষিপ্ততার চেয়ে সংখ্যাগত স্ট্রিংকে সংখ্যাগতভাবে বাছাই করা অন্তর্ভুক্ত রয়েছে।
মার্ক আমেরিকা

10
$inventory = 
    array(array("type"=>"fruit", "price"=>3.50),
          array("type"=>"milk", "price"=>2.90),
          array("type"=>"pork", "price"=>5.43),
          );

function pricesort($a, $b) {
  $a = $a['price'];
  $b = $b['price'];
  if ($a == $b)
    return 0;
  return ($a > $b) ? -1 : 1;
}

usort($inventory, "pricesort");
// uksort($inventory, "pricesort");

print("first: ".$inventory[0]['type']."\n\n");
// for usort(): prints milk (item with lowest price)
// for uksort(): prints fruit (item with key 0 in the original $inventory)

// foreach prints the same for usort and uksort.
foreach($inventory as $i){
  print($i['type'].": ".$i['price']."\n");
}

আউটপুট:

first: pork

pork: 5.43
fruit: 3.5
milk: 2.9

6

থেকে বাছাই করুন পিএইচপি প্রদত্ত কী এর মান দ্বারা মিশুক অ্যারে একটি অ্যারের :

uasort ( http://php.net/uasort ) আপনাকে আপনার নিজস্ব নির্ধারিত ফাংশন দ্বারা একটি অ্যারে বাছাই করতে দেয়। আপনার ক্ষেত্রে এটি সহজ:

$array = array(
  array('price'=>'1000.50','product'=>'test1'),
  array('price'=>'8800.50','product'=>'test2'),
  array('price'=>'200.0','product'=>'test3')
);

function cmp($a, $b) {
  return $a['price'] > $b['price'];
}

uasort($array, "cmp");

1
এই উত্তরটি নিম্ন মানের পর্যালোচনা সারিতে পরিণত হয়েছে সম্ভবতঃ আপনি কোডটির কোনও ব্যাখ্যা সরবরাহ করেন না বলে। যদি এই কোডটি প্রশ্নের উত্তর দেয় তবে আপনার উত্তরে কোডটি ব্যাখ্যা করে কিছু পাঠ্য যুক্ত করার বিষয়ে বিবেচনা করুন। এইভাবে, আপনি আরও বেশি কিছু পাওয়ার সম্ভাবনা বেশি - এবং প্রশ্নকারীকে নতুন কিছু শিখতে সহায়তা করুন।
lmo

1
hmpf। এটি সেরা উত্তর।
কমনপাইক

1
-1; এখানে cmpফাংশন ভুল। প্রথম যুক্তিকে যথাক্রমে কম, সমান, বা দ্বিতীয়ের চেয়ে বড় হিসাবে বিবেচনা করা হয় তবে " পরিবর্তে প্রত্যাবর্তন হয় "true বা "শূন্যের চেয়ে কম পূর্ণসংখ্যার পূর্বে ফিরে আসার কথা "false । মনে হয়, তবুও এটি কাজ করার জন্য - সম্ভবত কারণ বর্তমান বাস্তবায়ন usortএবং বন্ধুরা "তুলনায় কম" এবং "সমান" কে একইরকম আচরণ করে - তবে ভবিষ্যতের পিএইচপি সংস্করণগুলিতে এটি কাজ করে বলে বিবেচনা করবেন না। যদি তারা প্রকারগুলি স্থিতিশীল করার চেষ্টা করে (যেমন অকারণে সমান উপাদানগুলির কাছাকাছি না যায়), এটি ভেঙে যাবে।
মার্ক আমেরিকা

এছাড়াও, এখানের usortচেয়ে আরও উপযুক্ত হবে uasort, যেহেতু uasortকী এবং মানগুলির মধ্যে মেলামেশাটি সংরক্ষণ করা হয় যা অনুক্রমিক এবং অপ্রত্যাশিত যখন অনুক্রমিক সংখ্যাসূচক অ্যারের সাথে deaing করা হয়। উদাহরণস্বরূপ, $arrayকল করার পরে উপরের সূচীগুলি uasort2, 0 এবং 1 হয়। আপনি যদি কোনও কারণে না চান তবে আপনি সম্ভবত ব্যবহারে আরও স্বাচ্ছন্দ্য বোধ করবেন usort, যা অ্যারেটিকে পুনরায় সাজানোর পাশাপাশি পুনরায় সাজিয়ে তুলবে।
মার্ক আমেরিকা

5

100 000 রেকর্ডে পরীক্ষা করা হয়েছিল: সেকেন্ডে সময় (ফানকিটেন মাইক্রোটাইম দ্বারা গণনা করা)। কেবল কী পজিশনে বাছাইয়ের ক্ষেত্রে অনন্য মানের জন্য।

@ জোশ ডেভিস এর কার্যকারিতা সমাধান: ব্যয় সময় : 1.5768740177155

খনি সমাধান: ব্যয় সময় : 0.094044923782349

সমাধান:

function SortByKeyValue($data, $sortKey, $sort_flags=SORT_ASC)
{
    if (empty($data) or empty($sortKey)) return $data;

    $ordered = array();
    foreach ($data as $key => $value)
        $ordered[$value[$sortKey]] = $value;

    ksort($ordered, $sort_flags);

    return array_values($ordered); *// array_values() added for identical result with multisort*
}

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

@ ক্রিস বেকার, আপনি ঠিক বলেছেন। এটি কেবল অনন্য মূল্যবোধের জন্য কাজ করে। তবে এই সমাধানটি খুব দ্রুত কাজ করে, সুতরাং এটি তৈরি এবং এটির কারণ ছিল গতি। এই মুহূর্তে এটি বাস্তব নয়, এটি পিএইচপি 7.1.x দিয়ে পরীক্ষা করা দরকার
নেফেলিম

4

আমি uasortএই মত ব্যবহার

<?php
$users = [
    [
        'username' => 'joe',
        'age' => 11
    ],
    [
        'username' => 'rakoto',
        'age' => 21
    ],
    [
        'username' => 'rabe',
        'age' => 17
    ],
    [
        'username' => 'fy',
        'age' => 19
    ],    
];


uasort($users, function ($item, $compare) {
    return $item['username'] >= $compare['username']; 
});

var_dump($users);

3

এই ফাংশনটি পুনরায় ব্যবহারযোগ্য:

function usortarr(&$array, $key, $callback = 'strnatcasecmp') {
    uasort($array, function($a, $b) use($key, $callback) {
        return call_user_func($callback, $a[$key], $b[$key]);
    });
}

এটি ডিফল্টরূপে স্ট্রিংয়ের মানগুলিতে ভাল কাজ করে তবে আপনার সমস্ত মান সংখ্যা হলে আপনার একটি নম্বর তুলনা ফাংশনের জন্য কলব্যাক সাব করতে হবে।


আপনি এই কল usortarrকিন্তু তার uasortপরিবর্তে কল usort; সম্ভবত কিছুটা বিভ্রান্তিকর দ্বিতীয়টি হ'ল - সংখ্যাসূচক সূচকের সাথে ক্রমিক ক্রমের ক্ষেত্রে, যেমন প্রশ্নের মধ্যে প্রদর্শিত হয় - সম্ভবত আপনি আসলে কী চান।
মার্ক আমেরিকা

2

আপনি নিজের তুলনা ফাংশনটি সংজ্ঞায়িত করার চেষ্টা করতে পারেন এবং তারপরে ইউর্ট ব্যবহার করুন


হ্যাঁ. আমি যদি সমাধান না পাই তবে আমি এটি করব। আমি নিশ্চিত যে এখানে কিছু অদ্ভুত পরামিতি রয়েছে যা আপনি এটি সম্পাদন করতে এক ধরণের যোগ করতে পারেন। যদিও আপনার চিন্তার জন্য ধন্যবাদ!
ম্যাট

2

এখানে একটি পদ্ধতি যা আমি অনেক আগে খুঁজে পেয়েছি এবং কিছুটা পরিষ্কার করেছি। এটি দুর্দান্ত কাজ করে এবং অবজেক্টগুলিও গ্রহণ করতে দ্রুত পরিবর্তন করা যেতে পারে।

/**
 * A method for sorting arrays by a certain key:value.
 * SortByKey is the key you wish to sort by
 * Direction can be ASC or DESC.
 *
 * @param $array
 * @param $sortByKey
 * @param $sortDirection
 * @return array
 */
private function sortArray($array, $sortByKey, $sortDirection) {

    $sortArray = array();
    $tempArray = array();

    foreach ( $array as $key => $value ) {
        $tempArray[] = strtolower( $value[ $sortByKey ] );
    }

    if($sortDirection=='ASC'){ asort($tempArray ); }
        else{ arsort($tempArray ); }

    foreach ( $tempArray as $key => $temp ){
        $sortArray[] = $array[ $key ];
    }

    return $sortArray;

}

অবজেক্টগুলি বাছাই করার পদ্ধতিটি পরিবর্তনের জন্য কেবল নিম্নলিখিত লাইনটি পরিবর্তন করুন:

$tempArray[] = strtolower( $value[ $sortByKey ] ); প্রতি $tempArray[] = strtolower( $value->$sortByKey );

পদ্ধতিটি চালাতে সহজভাবে করুন

sortArray($inventory,'price','ASC');


এই পদ্ধতির কাজ করে তবে জোশ ডেভিসের জবাব (সাথে array_multisort) বা আমার (সহ usort) যে কোনও একটির তুলনায় এটি মোটামুটি কম সংক্ষিপ্ত এবং এটি তাদের বিনিময়ে কোনও সুবিধা দেয় না বলে মনে হয়।
মার্ক আমেরিকা

1
//Just in one line custom function
function cmp($a, $b)
{
return (float) $a['price'] < (float)$b['price'];
}
@uasort($inventory, "cmp");
print_r($inventory);

//result

Array
(
[2] => Array
    (
        [type] => pork
        [price] => 5.43
    )

[0] => Array
    (
        [type] => fruit
        [price] => 3.5
    )

[1] => Array
    (
        [type] => milk
        [price] => 2.9
    )

)

1

এটা চেষ্টা কর:

$prices = array_column($inventory, 'price');
array_multisort($prices, SORT_DESC, $inventory);
print_r($inventory);

হাই এবং স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম, এবং উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ। যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, আপনি কী সমস্যার সমাধান করেছিলেন এবং কীভাবে আপনি এটি সমাধান করেছেন সে সম্পর্কে আপনি কিছু ব্যাখ্যা যুক্ত করার বিষয়ে বিবেচনা করতে পারেন? এটি ভবিষ্যতের পাঠকদের আপনার উত্তরটি আরও ভালভাবে বুঝতে এবং এটি থেকে শিখতে সহায়তা করবে।
প্লুটিয়ান

0

সম্পূর্ণ ডায়নামিক ফাংশন এসোসিয়েটিভ অ্যারে বাছাইয়ের জন্য আমি এখানে ঝাঁপিয়ে পড়েছিলাম এবং এই চমকপ্রদ ফাংশনটি http://php.net/manual/en/function.sort.php এ পেয়েছি । এই ফাংশনটি খুব গতিশীল যা নির্দিষ্ট কী সহ আরোহণ এবং উত্থানের ক্রমকে সাজান।

একটি নির্দিষ্ট কী দ্বারা একটি অ্যারে সাজানোর জন্য সহজ ফাংশন। সূচকের সমিতি বজায় রাখে

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

-1
$arr1 = array(

    array('id'=>1,'name'=>'aA','cat'=>'cc'),
    array('id'=>2,'name'=>'aa','cat'=>'dd'),
    array('id'=>3,'name'=>'bb','cat'=>'cc'),
    array('id'=>4,'name'=>'bb','cat'=>'dd')
);

$result1 = array_msort($arr1, array('name'=>SORT_DESC);

$result2 = array_msort($arr1, array('cat'=>SORT_ASC);

$result3 = array_msort($arr1, array('name'=>SORT_DESC, 'cat'=>SORT_ASC));


function array_msort($array, $cols)
{
    $colarr = array();
    foreach ($cols as $col => $order) {
    $colarr[$col] = array();
    foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); }
}

$eval = 'array_multisort(';

foreach ($cols as $col => $order) {
    $eval .= '$colarr[\''.$col.'\'],'.$order.',';
}

$eval = substr($eval,0,-1).');';
eval($eval);
$ret = array();
foreach ($colarr as $col => $arr) {
    foreach ($arr as $k => $v) {
        $k = substr($k,1);
        if (!isset($ret[$k])) $ret[$k] = $array[$k];
        $ret[$k][$col] = $array[$k][$col];
    }
}
return $ret;


} 

যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। আপনার কোডটি ব্যাখ্যামূলক মন্তব্যে ভিড় না করার চেষ্টা করুন, কারণ এটি কোড এবং ব্যাখ্যা উভয়ের পাঠযোগ্যতা হ্রাস করে!
বিদায় স্ট্যাকএক্সচেঞ্জ

-5

এটা চেষ্টা কর:

asort($array_to_sort, SORT_NUMERIC);

রেফারেন্সের জন্য এটি দেখুন: http://php.net/manual/en/function.asort.php

বিভিন্ন ধরণের পতাকা এখানে দেখুন: http://www.php.net/manual/en/function.sort.php


এটি বহুমাত্রিক অ্যারেগুলির জন্য কাজ করবে না, তবে কেবলমাত্র অন্য সমস্যার জন্য আমাকে সাহায্য করেছে, ধন্যবাদ :)
স্কেলম্যাক্স

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