අගය අනුව බහුවිධ අරා වර්ග කරන්නේ කෙසේද?


1154

"ඇණවුම්" යතුරේ වටිනාකම අනුව මෙම අරාව වර්ග කරන්නේ කෙසේද? අගයන් දැනට අනුක්‍රමික වුවද ඒවා සැමවිටම නොවනු ඇත.

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
        )
)


ඉක්මන්ම ක්‍රමය නම් ඕනෑම ආකාරයක ආදාන, ගණනය කළ ක්ෂේත්‍ර සහ අභිරුචි වර්ග කිරීමේ ඇණවුම් සඳහා සහය දක්වන බ්‍රව්සරයේ සහ නෝඩ් දෙකෙහිම ස්වදේශීයව ක්‍රියා කරන සමාවයවික වර්ග කිරීමේ අරාව මොඩියුලය භාවිතා කිරීමයි .
ලොයිඩ්

Answers:


1779

බලන්න හොඳ usort , ඔබ තවමත් PHP 5.2 හෝ මීට පෙර නම්, ඔබ මුලින්ම තෝරා බේරා ගැනීමේ ශ්රිතයක් අර්ථ දැක්විය කිරීමට සිදුවේවි:

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

usort($myArray, 'sortByOrder');

PHP 5.3 සිට, ඔබට නිර්නාමික ශ්‍රිතයක් භාවිතා කළ හැකිය:

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

අවසාන වශයෙන් PHP 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
මගේ වාක්‍ය ඛණ්ඩනය ටිකක් අක්‍රීයයි, මම එය සංස්කරණය කරමි. මා අදහස් කළේ ඔබ PHP 5.3 හි නොමැති නම්, මෙම විශේෂිත වර්ග කිරීම සඳහා පමණක් ඔබ විශේෂ කාර්යයක් නිර්මාණය කළ යුතු බවයි (එය කෙසේ හෝ ඉතා අලංකාර නොවේ). එසේ නොමැතිනම් ඔබට එහි නිර්නාමික ශ්‍රිතයක් භාවිතා කළ හැකිය.
ක්‍රිස්තියානි ශිෂ්‍ය

23
On ජොනතන්: PHP කරන බොහෝ කාර්යයන් ඔබට සැබවින්ම දැකිය නොහැක. එය අරාව ගෙන මූලද්‍රව්‍ය දෙකකින් ආරම්භ වන අතර එය මෙම පරිශීලක අර්ථ දක්වන ලද ශ්‍රිතයට ලබා දුන්නේය. ඒවා සංසන්දනය කිරීම සඳහා ඔබේ ශ්‍රිතය වගකිව යුතුය: පළමු මූලද්‍රව්‍යය දෙවනියට වඩා විශාල නම්, ධන නිඛිලයක් නැවත ලබා දෙන්න, එය කුඩා නම් negative ණාත්මක එකක් ආපසු එවන්න. ඒවා සමාන නම්, 0. ආපසු එවන්න. PHP ඉන්පසු ඔබේ ශ්‍රිතයට තවත් මූලද්‍රව්‍ය දෙකක් යවා අරාව වර්ග කරන තෙක් එය දිගටම කරගෙන යයි. මෙහි ශ්‍රිතය ඉතා කෙටි ය, ඔබ පූර්ණ සංඛ්‍යා සංසන්දනය නොකරන්නේ නම් එය වඩාත් සංකීර්ණ වනු ඇත.
ක්‍රිස්තියානි ශිෂ්‍ය

62
වළක්වන්න: uasort()ඔබට අරාව යතුරු සුරැකීමට අවශ්‍ය නම් භාවිතා කරන්න.
thaddeusmt

15
වර්ග කළ හැකි අගයන් දශම සංඛ්‍යා නම් ප්‍රවේශම් වන්න. වර්ග කිරීමේ ශ්‍රිතය get a = 1 සහ $ b = 0.1 නම්, වෙනස 0.9 වේ, නමුත් ශ්‍රිතය int එකක් ලබා දෙයි, මේ අවස්ථාවේ දී 0, එබැවින් $ a සහ $ b සමාන ලෙස සලකනු ලබන අතර වැරදි ලෙස වර්ග කර ඇත. $ A $ b ට වඩා විශාල හෝ සමාන නම් සංසන්දනය කිරීම වඩා විශ්වාසදායක වන අතර ඒ අනුව -1, 1 හෝ 0 ආපසු එවන්න.
ග්‍රීන්ලැන්ඩි

37
එය දැන ගැනීමට මට ටික කාලයක් ගත විය. ප්‍රතිලෝම අනුපිළිවෙල (DESC) වර්ග කිරීම සඳහා ඔබට $ a සහ $ b මාරු කළ හැකිය. ඉතින් $ b ['order'] - $ a ['order']
JanWillem

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
help noc2spam උදව් කිරීමට මම සතුටු වෙමි, නමුත් වඩාත් කාර්යක්ෂම හා නිසැකවම වඩා පිළිවෙලට ඇති ස්ටූඩර්ගේ යෝජනාව සලකා බලන්න !
o0 '.

1
O ලොරිස් විශ්වාසයි මචන් මමත් ඒක පරීක්ෂා කරනවා. මට මෙම ප්‍රශ්නය හමු නොවුනා නම් ඊයේ කාර්යාලයේ වඩාත් දුෂ්කර දිනයක් වනු ඇත :-)
ගොගොල්

හ්ම්ම්ට පිළිතුරක් එක් කළ නොහැක .. හොඳයි මම එය මෙහි තැබුවෙමි coz මට එම මෝඩ කරුණු අවශ්‍ය නොවේ: එබැවින් බහුවිධ වර්ග කිරීම සඳහා එහි (පාහේ) එකම දෙය (srry ඔබට පේස්ට් පිටපත් කර නැවත ආකෘතිකරණය කළ යුතුය): ශ්‍රිතය aasort (& $ array , $ key1, $ key2, $ key3) {$ sorter = array (); $ ret = අරාව (); යළි පිහිටුවීම (ray අරාව); foreach ($ array ලෙස $ ii => $ va) {$ sorter [$ ii] = getPrice ($ va [$ key1] [$ key2] [$ key3]); s arsort (orter sorter); foreach (orter sorter as $ ii => $ va) {$ ret [$ ii] = $ array [$ ii]; } $ array = $ ret; }
Jaxx0rr

3
ඉහත පිළිතුරට වඩා අයදුම් කිරීමට පහසුය
මාසෙල්

1
ඔබ විශිෂ්ටයි!! PHP සඳහා චාම් වැනි වැඩ 7.2 බොහෝ ආදරණීයයි :)
කමලේෂ්

271

මම මෙම ශ්‍රිතය භාවිතා කරමි:

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
Ad රඩුමුර්සියා එබැවින් අරාව යොමු කිරීමකින් සම්මත කර පිටපතක් ලැබෙන ශ්‍රිතයට වඩා ශ්‍රිතය මගින් වෙනස් කළ හැකිය
ටොම් හේග්

1
D ඒඩ්‍රියන් පී. : අරාව යොමු කිරීම මඟින් සම්මත කර ඇති අතර එමඟින් එය වර්ග කළ පිටපතක් ආපසු ලබා දෙනවාට වඩා සම්මත අරා වෙනස් කරනු ඇත
ටොම් හේග්

73

මම සාමාන්‍යයෙන් usort භාවිතා කරන අතර මගේම සංසන්දනාත්මක ශ්‍රිතය පසු කරමි. මෙම අවස්ථාවේ දී, එය ඉතා සරල ය:

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

අභ්‍යවකාශ නැව් ක්‍රියාකරු භාවිතා කරමින් PHP 7 හි:

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

4
දමිත්, මම තත්පර 30 ක් මන්දගාමී විය. එය $ a - $ b නොවේද?
ක්‍රිස්තියානි ශිෂ්‍ය

3
මම හැම විටම මෙය වැරදියි. අත්පොතෙන් මට සිතීමට ඉඩ දෙන්න: පළමු තර්කය දෙවැන්නට වඩා අඩු යැයි සලකන්නේ නම් ප්‍රතිලාභ අගය ශුන්‍යයට වඩා අඩු විය යුතුය. එබැවින් $a['order']3 සහ $b['order']6 නම්, මම -3 නැවත ලබා දෙන්නෙමි. නිවැරදි?
ජෑන් ෆැබ්රි

3
හොඳයි, ඔබ ආපසු b - a, එබැවින් එය 3 වනු ඇත. මේ අනුව වැරදි ලෙස වර්ග කර ඇත.
ක්‍රිස්තියානි ශිෂ්‍ය

26
අහ්. හරි. මම භාවිතා කළේ තාර්කික නොවන අංක ගණිතය, එහිදී ඔබේ හිසෙහි අදහස ඔබ නිපදවන වචනවලට නොගැලපේ. මෙය බොහෝ විට සිකුරාදා දහවල් කාලයේදී අධ්‍යයනය කෙරේ.
ජෑන් ෆැබ්රි

යම් අවස්ථාවක ඉහත පිළිතුර නැවත වැරදි ප්‍රති result ලයකි
බිලාල් අහමඩ්

49

මෙය සාක්ෂාත් කර ගැනීම සඳහා එක් ප්‍රවේශයක් මේ හා සමාන වනු ඇත

    $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);

ප්‍රති ult ලය:

    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
            )

    )

මිහිරි. මෙම විසඳුම සඳහා මා කැමති දේ වන්නේ අතිරේක අරාව PHP හි ස්වදේශීය ක්‍රියාකාරිත්වය මගින් ගොඩනගා ඇති අතර එය වඩාත් වේගවත් වන අතර ඔබට බහුසෝර්ට් වෙතින් සම්පූර්ණ විකල්ප සමූහයක් ඇත. අභිරුචි වර්ග කිරීමේ කාර්යයක් සඳහා හොඳ පදනමක්. ස්තූතියි.
බ්‍රයන් කූගල්මන්

සරල නමුත් දීප්තිමත්. Hats off
ahmednawazbutt

19

"මාතෘකාව" යතුරු භාවිතයේ අගය අනුව අරාව වර්ග කිරීම සඳහා:

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

strcmp නූල් සංසන්දනය කරන්න.

uasort () අරාව යතුරු අර්ථ දක්වා ඇති පරිදි නඩත්තු කරයි.


strcmp යනු වර්චාර් වර්ග සඳහා කැපී පෙනෙන උපකාරයකි, කෙටි හා වේගවත් සඳහා මෙම පිළිතුරට මම කැමතියි
StudioX

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

මෙය ඉහළ සහ පහළ අක්ෂර දෙකම ගැන සැලකිලිමත් වේ.


4
විශේෂිත අරාව යතුරකින් වර්ග කිරීම පිළිබඳ ප්‍රශ්නයට මෙය පිළිතුරු දෙන්නේ කෙසේද?
සීනෝ

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

අපි එයට මුහුණ දෙමු: සෑම අරාව වර්ගීකරණයක්ම නිසි ලෙස හැසිරවීමට php හට කොටුවේ ක්‍රියාකාරිත්වයෙන් සරල එකක් නොමැත.

මෙම ක්‍රියා පටිපාටිය බුද්ධිමත් ය, එයින් අදහස් කරන්නේ වේගවත් නිදොස් කිරීම සහ නඩත්තු කිරීමයි:

// 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
"අපි එයට මුහුණ දෙමු: සෑම අරා වර්ගයක්ම නිසි ලෙස හැසිරවීමට php හට කොටුවේ ක්‍රියාකාරීත්වයෙන් පිටත සරල කාර්යයක් නොමැත." Us 'සඳහා usort / ksort / asort නිර්මාණය කර ඇත්තේ
එයයි

3
ඇත්තටම, PHP සතුව තෝරා බේරා ගැනීමේ කටයුතු ගොඩක් සෑම මාලාවක් ආකාරයක තත්වයක් හැසිරවීමට යොදා ගත හැකි බව.
අක්ෂය

නිදොස්කරණය සහ නඩත්තුව සම්බන්ධයෙන්, භාවිතය globalවිශාල රතු ධජයක් වන අතර එය සාමාන්‍යයෙන් අධෛර්යමත් වේ. mysql_fetch_arrayOP හි ප්‍රභව අරාව වෙනුවට මෙම ප්‍රශ්නය සඳහා නිරූපණය වන්නේ ඇයි සහ ඔබේ කේතය කරන්නේ කුමක්ද යන්න පිළිබඳ පැහැදිලි කිරීමක් නොමැති අතර ප්‍රති come ලය කුමක් විය හැකිදැයි කෙනෙකුට අපේක්ෂා කළ හැක්කේ කුමක් ද? සමස්තයක් වශයෙන් මෙය අපේක්ෂිත අවසාන ප්‍රති .ලය ලබා ගැනීමේදී ඉතා සංකීර්ණ ප්‍රවේශයකි.
fyrye

@tonygil ඔබගේ පිළිතුරෙන් සහ OP හි දත්ත කට්ටලයෙන් ඔබ අපේක්ෂිත ප්‍රති results ල මොනවාදැයි තීරණය කිරීමට මට නොහැකිය. එය ඔබට පැහැදිලිව පෙනෙන නමුත් ඔබේ පිළිතුර OP හි ප්‍රශ්නයට පිළිතුරු දෙන්නේ කෙසේදැයි මම නොදනිමි. කෙසේ වෙතත්, බලන්න: 3v4l.org/FEeFC භාවිතා කිරීම වෙනුවට ඔබට අතුරු-යොමු කිරීමක් කළ globalහැකිය. මෙය ගෝලීයව වෙනස් කළ හැකි හා ප්‍රවේශ විය හැකි එකකට වඩා පැහැදිලිව අර්ථ දක්වා ඇති විචල්‍යයක් නිපදවයි.
fyrye
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.