পিএইচপি সাব অ্যারে মান অনুসারে অ্যারে বাছাই করুন


110

আমার নিম্নলিখিত অ্যারে কাঠামো রয়েছে:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

এর উপর ভিত্তি করে ক্রমবর্ধমান উপায়ে অ্যারে অর্ডার করার সর্বোত্তম উপায় কী optionNumber?

সুতরাং ফলাফলগুলি দেখতে দেখতে:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

উত্তর:


204

ব্যবহার usort

function cmp_by_optionNumber($a, $b) {
  return $a["optionNumber"] - $b["optionNumber"];
}

...

usort($array, "cmp_by_optionNumber");

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

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

নোট করুন উপরের দুটি কোডই $a['optionNumber']একটি পূর্ণসংখ্যা বলে মনে হয়। @ স্টেট ব্যবহার করুন জন জনসনের সমাধান যদি তারা স্ট্রিং হয়।


পিএইচপি ≥≥.০-তে, ওভারফ্লো / কাটা সমস্যা রোধ করতে বিয়োগের পরিবর্তে স্পেসশিপ অপারেটরটি<=> ব্যবহার করুন ।

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

1
এটি আমাকে সত্যিকারের জন্য সহায়তা করে না কারণ আমি এটি ব্যবহারের জন্য একটি ফাংশন সরবরাহ করি - যা আমার মাথাটি পেতে পারে না এমন কঠিন বিষয়
Sjwdavies

17
ঠিক আছে, তিনি আপনাকে কেবল ব্যবহারের জন্য ফাংশনটি দিয়েছেন। এবং আপনি এটি গ্রহণ করতে যাচ্ছেন যে আপনি যা চান তা করতে সবসময় কোনও অন্তর্নির্মিত ফাংশন থাকে না, আপনাকে এটি নিজে লিখতে হবে। তুলনা ফাংশনগুলির জন্য কেবল দুটি উপাদানগুলির জন্য বাছাই ক্রম নির্দেশ করে 1, 0 বা -1 এর রিটার্ন প্রয়োজন require
টেসেরেক্স

1
আমি আরও জমিদারি দিকে তাকিয়েছিলাম এবং এটি আসলে বেশ দুর্দান্ত। আমি উপরেরটির সাথে একটি সাধারণ তুলনা ফাংশন লিখেছি, তবে '==' বাদ পড়েছি। সাহায্যকারী ছেলেদের জন্য ধন্যবাদ
Sjwdavies

3
এখন বন্ধ হিসাবেও: - usort ($ অ্যারে, ফাংশন ($ a, $ বি) {রিটার্ন $ বি ["বিকল্প নাম্বার"] - $ এ ["বিকল্প নাম্বার"];});
জোয়েরি

1
@ KiloumapL'artélon ফলাফল যদি হয় < 0, এটি সাজানোর ক্রিয়াকলাপটি যা aআগে উপস্থিত হওয়া উচিত তা বলে b। যদি তা হয় > 0তবে bতার আগে উপস্থিত হওয়া উচিতa
কেনেটিএম

57

ব্যবহার usort

 usort($array, 'sortByOption');
 function sortByOption($a, $b) {
   return strcmp($a['optionNumber'], $b['optionNumber']);
 }

7
@ বেনসিঙ্ক্লেয়ার, কারণ কেনির সমাধান সংখ্যার জন্য, এই সমাধানটি স্ট্রিংয়ের জন্য। এই বিকল্পের জন্য তারা উভয়ই সঠিক :-)
কুবিলে

সংবেদনশীল বাছাইয়ের জন্য স্ট্রাইকস্যাম্পের পরিবর্তে স্ট্রাইকস্যাম্প ব্যবহার করুন
user570605

অ্যারেতে আমরা দ্বিতীয় অর্ডারের জন্য কীটি সংজ্ঞায়িত করতে পারি তার মানে আমরা প্রথমে অপশনটি নম্বরের সাথে বাছাই করি শেষের সাথে শেষ বাছাই করে। কিভাবে এই জিনিস করতে পারেন?
ভাভিন থুমার

16

আমি কেনেটিএম এবং এজে কুইক উভয় সমাধান ব্যবহার করেছি এবং এমন একটি ফাংশন নিয়ে এসেছি যা অনেক ক্ষেত্রে এএসসি বা ডিইএসসি বাছাই বা কী সংরক্ষণের জন্য যেমন আপনার কাছে এই সমস্যাটিতে সহায়তা করতে পারে অ্যারের শিশু হিসাবে বস্তু থাকে

এখানে এই ফাংশনটি রয়েছে (স্পেসশিপ অপারেটরের কারণে পিএইচপি 7 এবং উচ্চতর জন্য কাজ করে):

/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if ($preserveKeys) {
        $c = [];
        if (is_object(reset($array))) {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v->$value);
            }
        } else {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v[$value]);
            }
        }
        $asc ? asort($b) : arsort($b);
        foreach ($b as $k => $v) {
            $c[$k] = $array[$k];
        }
        $array = $c;
    } else {
        if (is_object(reset($array))) {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
            });
        } else {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
            });
        }
    }

    return $array;
}

ব্যবহার:

sortBySubValue($array, 'optionNumber', true, false);

সম্পাদন করা

প্রথম অংশটি আবার ব্যবহার করে আবার লেখা যেতে পারে uasort()এবং ফাংশনটি আরও ছোট হবে (স্পেসশিপ অপারেটরের কারণে পিএইচপি 7 এবং এর চেয়ে বেশি এর জন্য কাজ করে):

/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if (is_object(reset($array))) {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        });
    } else {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        });
    }
    return $array;
}

এটি এখানে সবচেয়ে কার্যকর উত্তর, শীর্ষে থাকা উচিত;)
এডি বুদিমিলিক

@ এডিবুদিমিলিক আপনাকে ধন্যবাদ, আমি এটির প্রশংসা করি! উপায় দ্বারা আমি আমার উত্তর আপডেট করেছি এবং এই ফাংশনটির একটি সংক্ষিপ্ত সংস্করণ যুক্ত করেছি :)
পিগালেভ পাভেল

1
আমার জন্য এই কার্যকর করতে, আমি ব্যবহার করতে হয়েছে >পরিবর্তে (তার চেয়ে অনেক বেশী) -যখন তুলনা (বিয়োগ) $aএবং $bমান যেহেতু আমি স্ট্রিং তুলনা করা হয়। এখনও কাজ করে।
জেমস

1
@ জেমস আপনি ঠিক বলেছেন। আমি উত্তরটি পরিবর্তন করেছি এবং স্পেসশিপ অপারেটরের ব্যবহার যুক্ত করেছি (<=>)। এখন এটি ঠিক কাজ করা উচিত।
পিগালেভ পাভেল

এই মামলা সংবেদনশীল করার উপায় আছে?
লোফেল

4

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

function subval_sort($a,$subkey) {
    foreach($a as $k=>$v) {
        $b[$k] = strtolower($v[$subkey]);
    }
    asort($b);
    foreach($b as $key=>$val) {
        $c[$key] = $a[$key];
    }
    return $c;
}
$array = subval_sort($array,'optionNumber');

আপনি যদি উচ্চ থেকে নিম্নে চান তবে ভাড়ার পরিবর্তে আর্সোর্ট ব্যবহার করুন।

কোড ক্রেডিট: http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/


4

অ্যারে_মলিটোর্ট (), অ্যারে_ম্যাপ () ব্যবহার করে

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

print_r($array);

ডেমো


2
এটি কেবল খুব সহজেই কাজ করে। ধন্যবাদ. আমাকে যা করতে হয়েছিল তা হ'ল আমার কলামের নাম পরিবর্তন করা এবং এটি কার্যকর হয়েছিল।
Kobus মাইবার্গ

2
এটি প্যারেন্ট
অ্যারেগুলির

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