كيف يمكنني فرز مصفوفة متعددة الأبعاد في PHP

لدي بيانات CSV محملة في مصفوفة متعددة الأبعاد. وبهذه الطريقة ، يكون كل "صف" عبارة عن سجل ويحتوي كل "عمود" على نفس نوع البيانات. أستخدم الوظيفة أدناه لتحميل ملف CSV.

function f_parse_csv($file, $longest, $delimiter)
{
  $mdarray = array();
  $file    = fopen($file, "r");
  while ($line = fgetcsv($file, $longest, $delimiter))
  {
    array_push($mdarray, $line);
  }
  fclose($file);
  return $mdarray;
}

أحتاج إلى أن أتمكن من تحديد عمود للفرز حتى يعيد ترتيب الصفوف. يحتوي أحد الأعمدة على معلومات التاريخ بتنسيق Y-m-d H: i: s وأود أن أكون قادرًا على التصنيف مع أحدث تاريخ هو الصف الأول.

0
(بعد عامين ...) إذا كنت تقوم بفرز التواريخ المخزنة كسلاسل ، فقد تحتاج أولاً إلى استخدام strtotime [1] docs.php.net/manual/en/function.strtotime.php
وأضاف المؤلف Dan Burton, مصدر

11 إجابة

باستخدام usort . في ما يلي حل عام ، يمكنك استخدامه في أعمدة مختلفة:

class TableSorter {
  protected $column;
  function __construct($column) {
    $this->column = $column;
  }
  function sort($table) {
    usort($table, array($this, 'compare'));
    return $table;
  }
  function compare($a, $b) {
    if ($a[$this->column] == $b[$this->column]) {
      return 0;
    }
    return ($a[$this->column] < $b[$this->column]) ? -1 : 1;
  }
}

للفرز حسب العمود الأول:

$sorter = new TableSorter(0);//sort by first column
$mdarray = $sorter->sort($mdarray);
0
وأضاف
استبدل "protrected" بـ "var" و "__construct" بـ "TableSorter" ، وسيعمل في PHP4. لاحظ مع ذلك ، أن PHP4 توقف.
وأضاف المؤلف troelskn, مصدر
أحصل على خطأ في التحليل: خطأ في التحليل ، غير متوقع T_STRING ، متوقعًا T_OLD_FUNCTION أو T_FUNCTION أو T_VAR أو '}' في السطر الثاني من هذه الفئة.
وأضاف المؤلف Melikoth, مصدر
لقد قمت بتعيين PHP إلى v5 ، ولم أكن أعلم أنه كان يعمل على الإصدار v4 بشكل افتراضي. بعد النظر إليها لفترة من الوقت أعتقد أنني أفهم كيفية تعديلها لأنواع مختلفة من أنواع كذلك
وأضاف المؤلف Melikoth, مصدر
يتطلب هذا الرمز php5
وأضاف المؤلف Devon, مصدر

قبل أن أتمكن من تشغيل فئة TableSorter كنت قد أتيحت لي وظيفة تعتمد على ما قدمته Shinhan .

function sort2d_bycolumn($array, $column, $method, $has_header)
  {
  if ($has_header)  $header = array_shift($array);
  foreach ($array as $key => $row) {
    $narray[$key]  = $row[$column]; 
    }
  array_multisort($narray, $method, $array);
  if ($has_header) array_unshift($array, $header);
  return $array;
  }
  • $ array هو MD Array الذي تريد فرزه.
  • $ column هو العمود الذي ترغب في الفرز به.
  • الطريقة $ هي الطريقة التي تريد بها إجراء الفرز ، مثل SORT_DESC
  • تم تعيين $ has_header على "true" إذا احتوى الصف الأول على قيم رأس لا تريد تصنيفها.
0
وأضاف

فرز صفوف متعددة باستخدام إغلاق

وهنا نهج آخر باستخدام uasort() ووظيفة رد الاتصال المجهول (إغلاق). لقد استعملت هذه الوظيفة بانتظام. 5.3 PHP مطلوب - لا مزيد من التبعيات!

/**
 * Sorting array of associative arrays - فرز صفوف متعددة باستخدام إغلاق.
 * See also: http://the-art-of-web.com/php/sortarray/
 *
 * @param array $data input-array
 * @param string|array $fields array-keys
 * @license Public Domain
 * @return array
 */
function sortArray( $data, $field ) {
    $field = (array) $field;
    uasort( $data, function($a, $b) use($field) {
        $retval = 0;
        foreach( $field as $fieldname ) {
            if( $retval == 0 ) $retval = strnatcmp( $a[$fieldname], $b[$fieldname] );
        }
        return $retval;
    } );
    return $data;
}

/* example */
$data = array(
    array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
    array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
    array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
    array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
    array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
    array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
    array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);

$data = sortArray( $data, 'age' );
$data = sortArray( $data, array( 'lastname', 'firstname' ) );
0
وأضاف

تقديم: حل معمم جدًا لـ PHP 5.3+

أرغب في إضافة حل خاص بي هنا ، لأنه يوفر ميزات لا توفرها الإجابات الأخرى.

على وجه التحديد ، تتضمن مزايا هذا الحل ما يلي:

  1. إنها قابلة لإعادة الاستخدام : يمكنك تحديد عمود الفرز كمتغير بدلاً من ترميزه.
  2. إنها مرنة : يمكنك تحديد أعمدة فرز متعددة (حسب العدد الذي تريده) - يتم استخدام أعمدة إضافية كقوائم التعادل بين العناصر التي تقارن أولاً.
  3. إنها قابلة للانعكاس : يمكنك تحديد أنه يجب عكس هذا الترتيب - بشكل فردي لكل عمود.
  4. إنها قابلة للتوسعة : إذا كانت مجموعة البيانات تحتوي على أعمدة لا يمكن مقارنتها بطريقة "غبية" (مثل سلاسل التاريخ) ، فيمكنك أيضًا تحديد كيفية تحويل هذه العناصر إلى قيمة يمكن أن تكون مباشرة مقارنة (مثل مثال DateTime ).
  5. إنها جماعية إذا كنت تريد : تعتني هذه الشفرة بفرز العناصر ، ولكن حدد وظيفة الفرز الفعلي ( usort أو > uasort </القانون>). </لى>
  6. وأخيرًا ، لا يستخدم array_multisort : بينما array_multisort ملائم ، يعتمد ذلك على إنشاء إسقاط لجميع بيانات الإدخال الخاصة بك قبل الفرز. هذا يستهلك الوقت والذاكرة وقد يكون ببساطة باهظة إذا كانت مجموعة البيانات الخاصة بك كبيرة.

الرمز

function make_comparer() {
   //Normalize criteria up front so that the comparer finds everything tidy
    $criteria = func_get_args();
    foreach ($criteria as $index => $criterion) {
        $criteria[$index] = is_array($criterion)
            ? array_pad($criterion, 3, null)
            : array($criterion, SORT_ASC, null);
    }

    return function($first, $second) use (&$criteria) {
        foreach ($criteria as $criterion) {
           //How will we compare this round?
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

           //If a projection was defined project the values now
            if ($projection) {
                $lhs = call_user_func($projection, $first[$column]);
                $rhs = call_user_func($projection, $second[$column]);
            }
            else {
                $lhs = $first[$column];
                $rhs = $second[$column];
            }

           //Do the actual comparison; do not return if equal
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            }
            else if ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        return 0;//tiebreakers exhausted, so $first == $second
    };
}

كيف تستعمل

في جميع أنحاء هذا القسم ، سأقدم الروابط التي تصنف هذه المجموعة من عينات البيانات:

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '01/12/1979'),
    array('aa', 'name' => 'Paul', 'number' => 16, 'birthday' => '03/11/1987'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);

أساسيات

تقبل الدالة make_comparer عددًا متغيرًا من الوسيطات التي تحدد الفرز المطلوب وترجع الدالة التي من المفترض أن تستخدمها كوسيطة usort أو uasort </كود>.

إن أبسط حالة استخدام هي تمرير المفتاح الذي ترغب في استخدامه لمقارنة عناصر البيانات. على سبيل المثال ، لفرز $ data </​​code> بواسطة عنصر اسم الذي يمكنك القيام به

usort($data, make_comparer('name'));

See it in action.

يمكن أن يكون المفتاح أيضًا رقمًا إذا كانت العناصر مفهرسة رقميًا. على سبيل المثال في السؤال ، سيكون هذا

usort($data, make_comparer(0));//0 = first numerically indexed column

See it in action.

أعمدة فرز متعددة

You can specify أعمدة فرز متعددة by passing additional parameters to make_comparer. For example, to sort by "number" and then by the zero-indexed column:

usort($data, make_comparer('number', 0));

See it in action.

الخيارات المتقدمة

More الخيارات المتقدمة are available if you specify a sort column as an array instead of a simple string. This array should be numerically indexed, and must contain these items:

0 => the column name to sort on (mandatory)
1 => either SORT_ASC or SORT_DESC (optional)
2 => a projection function (optional)

دعونا نرى كيف يمكننا استخدام هذه الميزات.

عكس الترتيب

للفرز حسب الاسم تنازلي:

usort($data, make_comparer(['name', SORT_DESC]));

See it in action.

للفرز حسب رقم تنازلي ثم حسب تنازلي اسم:

usort($data, make_comparer(['number', SORT_DESC], ['name', SORT_DESC]));

See it in action.

توقعات مخصصة

في بعض السيناريوهات ، قد تحتاج إلى الفرز حسب عمود لا تقرض قيمه جيدًا للفرز. يلائم عمود "عيد ميلاد" في مجموعة بيانات العينة هذا الوصف: لا معنى لمقارنة تواريخ الميلاد (مثل "01/01/1980" قبل "10/10/1970"). في هذه الحالة ، نريد تحديد كيفية مشروع البيانات الفعلية إلى نموذج يمكن مقارنة مباشرة مع الدلالات المطلوبة.

يمكن تحديد الإسقاطات كأي نوع من callable : كسلسل أو صفائف أو وظائف مجهولة. يفترض أن يقبل الإسقاط حجة واحدة ويعيد شكله المتوقع.

وتجدر الإشارة إلى أنه في حين أن الإسقاطات تشبه وظائف المقارنة المخصصة المستخدمة مع usort والعائلة ، فهي أبسط (تحتاج فقط إلى تحويل قيمة إلى أخرى) والاستفادة من جميع الوظائف المخبوزة بالفعل في make_comparer .

دعونا نفرز مجموعة بيانات المثال بدون إسقاط ونرى ما يحدث:

usort($data, make_comparer('birthday'));

See it in action.

لم يكن هذا هو النتيجة المرجوة. ولكن يمكننا استخدام date_create كإسقاط:

usort($data, make_comparer(['birthday', SORT_ASC, 'date_create']));

See it in action.

هذا هو الترتيب الصحيح الذي أردناه.

هناك الكثير من الأشياء التي يمكن أن تحققها التوقعات. على سبيل المثال ، طريقة سريعة للحصول على فرز غير متحسسة لحالة الأحرف هي استخدام strtolower كإسقاط.

ومع ذلك ، ينبغي أن أذكر أيضًا أنه من الأفضل عدم استخدام الإسقاطات إذا كانت مجموعة البيانات الخاصة بك كبيرة: ففي هذه الحالة سيكون من الأسرع جدًا عرض جميع بياناتك يدويًا في المقدمة ثم الترتيب دون استخدام إسقاط ، على الرغم من أنه سيتم التداول زيادة استخدام الذاكرة للحصول على سرعة فرز أسرع.

وأخيرًا ، إليك مثال يستخدم جميع الميزات: حيث يتم ترتيبه أولاً بالترتيب التنازلي ، ثم حسب تاريخ الميلاد تصاعديًا:

usort($data, make_comparer(
    ['number', SORT_DESC],
    ['birthday', SORT_ASC, 'date_create']
));

See it in action.

0
وأضاف
بسهولة الإجابة الأقل تقديرًا على هذا الموقع.
وأضاف المؤلف jmeas, مصدر
ربما هذا هو أفضل إجابة رأيتها على stackoverflow. شكرا لك على قطعة جميلة من التعليمات البرمجية والوثائق الرائعة !!!
وأضاف المؤلف maddob, مصدر
Jon شكرا لإجابة رهيبة. ومع ذلك ، أجد أنه من الصعب استخدامها. هل يمكن أن تنصحوني على PHP "> stackoverflow.com/questions/36784955/&hellip؛
وأضاف المؤلف Ironic, مصدر
@ جون شكرا لتعليقك. ومع ذلك ، ما زلت أقرأ إجابتك وأحاول أن أفهمها. إذا لزم الأمر سأستخدم نفس الشيء في مشروعي. كان مجرد شك واحد. لست متأكدًا من أنها ستعمل مع بياناتي/صفيفاتي أو لا. في المثال الخاص بك البيانات في تنسيق مختلف.
وأضاف المؤلف Ironic, مصدر
@ جون عندما أتحقق من الإجراء الأخير (مع معاودة الاتصال date_create ) ، يكون تاريخ الميلاد بترتيب خاطئ. هل من الممكن ان تأكد ؟ أحصل على 01/12/1979 و 03/11/1987 و 12/03/1980 و 24/06/1967 </القانون>. إذا استخدمت strtotime بدلاً من ذلك ، فإنني أحصل على نتيجة جيدة. أفترض أنه DateTime هذا مقطوعة.
وأضاف المؤلف David Bélanger, مصدر
مهلا ، @ جون ، لا أعرف كيف يمكنني الاتصال بك ولكن من خلال التعليق. أرى أنك خلقت علامة "مجموعة متعددة الأبعاد" ، ولكننا نحتاج أيضًا إلى "بيانات متعددة الأبعاد" لمصطلح مشابه في تصور البيانات والتخصصات ذات الصلة. لا يمكنني إنشاء علامات ، فهل يمكنني أن أطالبك بإنشاء واحدة ، إذا وجدت أن ذلك أمر منطقي؟
وأضاف المؤلف VividD, مصدر
أنا متأخرة قليلاً للحفل هنا ، لكن أريد فقط أن أشكرك على هذا. مفيد جدا.
وأضاف المؤلف RobertAKARobin, مصدر
@ Dashrath: لست متأكدا ما هي هيكلك. إما أن تمر في $ array ['index'] إذا كنت ترغب في التخلص من المستوى الأعلى ، أو استخدم دالة projection ($ sub) {return $ sub ['index'] . } إذا كنت تريد التخلص من البُعد المتوسط ​​المستوى المسمى index .
وأضاف المؤلف Jon, مصدر
CalculatingMachine قرأت السؤال ، ولكنك لا تظهر ما حاولت القيام به. يبدو أن usort ($ data ['content'] ، get_comparer ('price')) سيكون كافيًا ، ولكن لا يمكنني التأكد.
وأضاف المؤلف Jon, مصدر
VividD: لم أقم بإنشاء العلامة بنفسي ، ولا يمكن إنشاء العلامة بنفسها. يتم إنشاء علامات جديدة ضمنيًا عندما يستخدمها شخص لديه الامتيازات المطلوبة لوضع علامة على سؤال ؛ بالنظر إلى أنني لم أر قط ، وربما لن أرى سؤالًا أشعر أنه يجب وضع علامة عليه بهذا الشكل ، لا يمكنني حقاً المساعدة.
وأضاف المؤلف Jon, مصدر
YahyaE: فرز المصفوفات من الكائنات؟ استبدل $ first [$ column] بـ $ first -> $ column ، والشيء نفسه لـ $ second . أربع بدائل في المجموع.
وأضاف المؤلف Jon, مصدر
Ecropolis: لا يدعم PHP 5.3 بنية المصفوفة [...] القصيرة ، سيكون عليك استخدام array (...) بدلاً من ذلك. لم أفعل ذلك في الأمثلة لإيجاز إضافي ، ولكن make_comparer نفسها متوافقة مع 5.3.
وأضاف المؤلف Jon, مصدر
Ecropolis: لديك اقتباسات إضافية حول وظيفة ($ t) ... التي تحتاج إلى إزالتها. في صحتك!
وأضاف المؤلف Jon, مصدر
Ecropolis: حسنًا ، حتى تتمكن من إنشاء صفيف حيث تكون المفاتيح عبارة عن أنواع filetypes والقيم هي "الأوزان" (وزن أصغر = عنصرًا في الأعلى) مع $ weights = array_flip ($ sort_array) . $ weights الآن ['mp4' => 0، 'mpeg' => 1، ...] . يمكنك الاستفادة من ذلك في المقارنة عن طريق الفرز على filetype واستخدامه كإسقاط: وظيفة ($ t) تستخدم ($ weights) {return $ weights [$ t]؛ }) </القانون>.
وأضاف المؤلف Jon, مصدر
Andrew: مثال . ولكن تذكر أن هذا غير فعال حتى لا تفعل ذلك إذا كانت مجموعة البيانات الخاصة بك ليست صغيرة.
وأضاف المؤلف Jon, مصدر
Ecropolis: الرجاء نشر مثال جيد لمدخلاتك والإخراج المطلوب في مكان ما (على سبيل المثال ، ideone.com أو pastebin.com) حتى نتمكن من إزالة سوء الفهم.
وأضاف المؤلف Jon, مصدر
@ DavidBélanger: ما عنوان URL بالضبط؟ كل الأمثلة تعمل بشكل صحيح على كل من ideone.com وعلى جهازك المحلي.
وأضاف المؤلف Jon, مصدر
Jon شكرا ، لقد حاولت ذلك فقط وهو 0.006 ثانية أبطأ من دون ذلك ، فرز 200 صف. أعتقد أنني سوف أقبل هذا النوع من عدم الكفاءة :)
وأضاف المؤلف Andrew, مصدر
هل يمكن أن تعطي مثالاً على كيفية تنفيذ فرز غير حساس لحالة الأحرف؟ حاولت تحويل الإسقاط إلى أحرف صغيرة لكنها لن تعمل ...
وأضاف المؤلف Andrew, مصدر
Jon - شكرًا لك هنا هي صفائف المثال مع التعليقات. ideone.com/utbrNt
وأضاف المؤلف Ecropolis, مصدر
لدي مصفوفة أخرى من القيم التي أرغب في فرز عمود بها وقد تحتوي القيمة الموجودة في العمود على عدة مطابقات. مصفوفة الفرز هي من أنواع الملفات لذلك أرغب دائمًا في عرض أنواع الملفات من قائمة الملفات بترتيب معين. هل من الممكن في هذا البناء؟
وأضاف المؤلف Ecropolis, مصدر
ممتاز! شكرا لك @ جون. لقد قمت بتحديث ideone.com/utbrNt للمثال الكامل لكيفية استخدام هذه الوظيفة لفرز مصفوفة باستخدام أخرى ل قيم الفرز المرجعي.
وأضاف المؤلف Ecropolis, مصدر
@ جون - شكرا على كل مساعدتكم. لقد حاولت تنفيذ ذلك على الخادم الخاص بي وحصلت على هذا: خطأ في تحليل PHP: خطأ في بناء الجملة ، غير متوقع '[' ، توقع '' '- حاولت تباينًا مختلفًا ، فأنا فقدت بعض الشيء في كيفية عمل ذلك بالفعل. أنا على v5.3.28 - تشغيل ideone.com PHP 5.4 - هل هذه هي القضية؟
وأضاف المؤلف Ecropolis, مصدر
لي هو مجموعة 4D؟ كيف يمكنني اجتياز الفهرس إذا كان ذلك ممكنًا؟
وأضاف المؤلف Dashrath, مصدر
Jon إجابة كبيرة وأنا أوافق على أن هذا هو مثل موقع على شبكة الإنترنت بدلا من الإجابة. شكر. لديك سؤال واحد فقط. كيف يمكنني جعله يعمل للتشغيل للأشياء؟
وأضاف المؤلف YahyaE, مصدر

The "Usort" function is your answer.
http://php.net/usort

0
وأضاف
لقد قمت بتخفيضك بسبب فشلك في تقديم حل مع الشرح والأمثلة على السؤال الأصلي. تحديث الرد الخاص بك وأنا سوف عكس تصويتي.
وأضاف المؤلف crafter, مصدر

You can use array_multisort()

جرّب شيئًا كهذا:

foreach ($mdarray as $key => $row) {
   //replace 0 with the field's index/key
    $dates[$key]  = $row[0];
}

array_multisort($dates, SORT_DESC, $mdarray);

For PHP >= 5.5.0 just extract the column to sort by. No need for the loop:

array_multisort(array_column($mdarray, 0), SORT_DESC, $mdarray);
0
وأضاف
لذلك في هذا المثال ، قد يكون $ mdarray صفيفًا ثنائي الأبعاد ، مثل صفيف من سجلات قاعدة البيانات. في هذا المثال ، 0 هو فهرس عمود "التاريخ" في كل سجل (أو صف). لذا يمكنك إنشاء صفيف تواريخ $ (بشكل أساسي نفس الصفيف ، ولكن مع هذا العمود فقط) ، وإخبار الدالة array_multisort بفرز mdarray $ استنادًا إلى قيم العمود المحدد.
وأضاف المؤلف Dan Burton, مصدر
من أجل الوضوح ، قد تضيف إلى بداية هذا المثال $ dates = array ()؛
وأضاف المؤلف Dan Burton, مصدر
أعتقد أن هذا يبين لي لماذا لم أستطع الحصول على array_multisort للعمل من قبل.
وأضاف المؤلف Melikoth, مصدر
هل يجب أن يعمل array_multisort مع المصفوفات النقابية (تغيير $ row [0] إلى $ row ['whatever'] ؟ لا أذهب إلى هنا .. بعد أن قمت بتغيير المصفوفة إلى رقمي عملت الدالة كما هو متوقع.
وأضاف المؤلف a coder, مصدر
هناك مثال أكثر شمولا لهذه الإجابة الآن على صفحة array_multisort PHP: php.net/manual/en/function.array-multisort.php#example-4928 .
وأضاف المؤلف icc97, مصدر
تحذير: array_multisort (): أحجام صفيف غير متناسقة
وأضاف المؤلف RaviPatidar, مصدر
array_multisort() هي الطريقة التي قمت بها دائما ، على الرغم من أنه قد يكون من الصعب بعض الشيء لفك رأسك حول كيفية عمله في البداية.
وأضاف المؤلف Garrett Albright, مصدر
إذا كان array_multi_sort() هو الجواب ، فهذا يعني أن السؤال لم يتم فهمه. في حين أنه من الناحية الفنية ستعمل ، عادة ما يكون هناك حل أفضل مع وظيفة مقارنة ولدت المستخدم واستخدام وظيفة usort() . من الأسهل الحفاظ عليه. مع multisort ، عادةً ما تقوم بإنشاء رمز يقوم بإعداد البيانات للفرز. إذا تغيرت بنية البيانات ، فقد يتم التخلص من هذا الرمز. مع usort() ، يمكنك تغيير وظيفة مقارنة - بنفس الطريقة التي قمت بتغيير بنية البيانات.
وأضاف المؤلف Sven, مصدر
ساعدني هذا الجواب حقاً في مشروعي الحالي ، شكراً!
وأضاف المؤلف Stephen, مصدر
أليس تضمين $ key غير ضروري عند استخدام array_multisort() ؟ يبدو أكثر بساطة وأكثر تعمدًا كتابة foreach ($ mdarray كصف $) {$ sortByDate [] = $ row ['date']؛ } ثم array_multisort ($ sortByDate، SORT_DESC، $ mdarray)؛ (الأميال الدلالية الخاصة بي تختلف).
وأضاف المؤلف Mark Fox, مصدر
لسبب غير معروف لم يعمل usort بالنسبة لي. هذا لا.
وأضاف المؤلف cameronjonesweb, مصدر
إجابة رائعة. إنه جيد جدا بالنسبة لي
وأضاف المؤلف Raul A., مصدر

أنا أفضل استخدام array_multisort. انظر الوثائق هنا .

0
وأضاف

في ما يلي فئة php4/php5 التي ستعمل على فرز حقل واحد أو أكثر:

// a sorter class
//  php4 and php5 compatible
class Sorter {

  var $sort_fields;
  var $backwards = false;
  var $numeric = false;

  function sort() {
    $args = func_get_args();
    $array = $args[0];
    if (!$array) return array();
    $this->sort_fields = array_slice($args, 1);
    if (!$this->sort_fields) return $array();

    if ($this->numeric) {
      usort($array, array($this, 'numericCompare'));
    } else {
      usort($array, array($this, 'stringCompare'));
    }
    return $array;
  }

  function numericCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      if ($a[$sort_field] == $b[$sort_field]) {
        continue;
      }
      return ($a[$sort_field] < $b[$sort_field]) ? ($this->backwards ? 1 : -1) : ($this->backwards ? -1 : 1);
    }
    return 0;
  }

  function stringCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      $cmp_result = strcasecmp($a[$sort_field], $b[$sort_field]);
      if ($cmp_result == 0) continue;

      return ($this->backwards ? -$cmp_result : $cmp_result);
    }
    return 0;
  }
}

/////////////////////
// usage examples

// some starting data
$start_data = array(
  array('first_name' => 'John', 'last_name' => 'Smith', 'age' => 10),
  array('first_name' => 'Joe', 'last_name' => 'Smith', 'age' => 11),
  array('first_name' => 'Jake', 'last_name' => 'Xample', 'age' => 9),
);

// sort by last_name, then first_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort by first_name, then last_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'first_name', 'last_name'));

// sort by last_name, then first_name (backwards)
$sorter = new Sorter();
$sorter->backwards = true;
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort numerically by age
$sorter = new Sorter();
$sorter->numeric = true;
print_r($sorter->sort($start_data, 'age'));
0
وأضاف
هل هذا فقط يعمل مع صفائف النقابي؟
وأضاف المؤلف Melikoth, مصدر
نعم - صفائف الارتباط فقط. الآن بعد أن نظرت إليه ، ليس الحل الصحيح لهذه المشكلة.
وأضاف المؤلف Devon, مصدر

أعلم أنه سنتان منذ طرح هذا السؤال والإجابة عليه ، ولكن هنا وظيفة أخرى تقوم بترتيب مصفوفة ثنائية الأبعاد. يقبل عددًا متغيرًا من الوسيطات ، مما يسمح لك بالمرور بأكثر من مفتاح واحد (أي اسم العمود) للفرز حسب. PHP 5.3 مطلوب.

function sort_multi_array ($array, $key)
{
  $keys = array();
  for ($i=1;$i< $b[$keys[$i]]) ? -1 : 1;
      }
    }
    return 0;
  };

  usort($array, $func);

  return $array;
}

Try it here: http://www.exorithm.com/algorithm/view/sort_multi_array

0
وأضاف
نعم أعتقد ذلك
وأضاف المؤلف Mike C, مصدر

لقد جربت العديد من الأجوبة الشائعة array_multisort() و usort() ولم يعمل أي منهم لي. تصبح البيانات مختلطة فقط والرمز غير قابل للقراءة. وهنا حل سريع القذرة. تحذير: استخدم هذا فقط إذا كنت متأكدًا من أن أحد المحددات المارقة لن يعود ليلاحقك لاحقًا!

لنفترض أن كل صف في صفيفتك المتعددة يبدو مثل: name و stuff1 و stuff2:

// Sort by name, pull the other stuff along for the ride
foreach ($names_stuff as $name_stuff) {
   //To sort by stuff1, that would be first in the contatenation
    $sorted_names[] = $name_stuff[0] .','. name_stuff[1] .','. $name_stuff[2];
}
sort($sorted_names, SORT_STRING);

تحتاج الأشياء الخاصة بك مرة أخرى في الترتيب الأبجدي؟

foreach ($sorted_names as $sorted_name) {
    $name_stuff = explode(',',$sorted_name);
   //use your $name_stuff[0] 
   //use your $name_stuff[1] 
   //... 
}

نعم ، إنها قذرة. ولكن السوبر سهلة ، لن تجعل رأسك تنفجر.

0
وأضاف
function cmp($a, $b)
{
$p1 = $a['price'];
$p2 = $b['price'];
return (float)$p1 > (float)$p2;
}
uasort($my_array, "cmp");

http://qaify.com/sort-an-array-of-associative-arrays-by-value-of-given-key-in-php/

0
وأضاف