فرض کنید آرایه ای از object ها در اختیار داشته باشیم و بخواهیم اعضای این آرایه را بر اساس property خاصی مرتب سازی کنیم. برای اینکار می توان از تابع usort استفاده کرد. این تابع به معنای user defined sort است و همانطور که از نام آن پیداست این امکان را به ما می دهد تا نحوه مرتب سازی را خودمان تعیین کنیم. ساختار کلی این دستور به شکل زیر است:
bool usort ( array &$array , callable $value_compare_func );
پارامتر اول این تابع آرایه مورد نظر برای مرتب سازی و پارامتر دوم تابعی است که برای مرتب سازی معرفی میکنیم. این تابع باید به عنوان خروجی عددی منفی، صفر یا عددی مثبت تولید کند. اگر عدد تولید شده در تابع از جنس float باشد، به صورت خودکار به integer تبدیل می شود. در نتیجه ممکن است مقادیر ۰٫۹۹ و ۰٫۱ برابر در نظر گرفته شوند. برای جلوگیری از این اتفاق سعی کنید تابعی بنویسید که همیشه نتیجه مقایسه را با عددی صحیح نمایش دهد. به مثال زیر توجه کنید:
<?php function cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } $a = array(3, 2, 5, 6, 1); usort($a, "cmp"); foreach ($a as $key => $value) { echo "$key: $value\n"; } ?>
نتیجه کد بالا به صورت زیر خواهد بود:
۰: ۱ ۱: ۲ ۲: ۳ ۳: ۵ ۴: ۶
حال اگر بخواهیم آرایه ای را مرتب سازی کنیم که اعضای آن اولا از جنس object هستند و دوما ملاک مرتب سازی ما property خاصی از object ها باشد و سوما این property از نوع string باشد و در نهایت چهارما مرتب سازی صعودی باشد. به ظاهر شرایط پیچیده تر شد اما پیاده سازی تفاوت چندانی نخواهد کرد. به مثال زیر توجه کنید:
<?php $arr = array(); $date = new DateTime(); for($i=0 ; $i<5 ; $i++) { $obj = new stdClass(); $obj->id = $i; $obj->date = $date->format('Y-m-d H:i:s'); array_push($arr, $obj); $date->add(new DateInterval('P1D')); } function sort_obj($a, $b) { return $a->date - $b->date; } usort($arr, sort_obj); header('Content-Type: application/json'); print(json_encode($arr)); ?>
حال اگر بخواهیم همین مرتب سازی را بصورت نزولی انجام بدهیم کافیست در تابع مرتب سازی جای دو عنصر مقایسه شونده را با هم عوض کنیم و یا اینکه نتیجه مقایسه را در عدد منفی ۱ ضرب کنیم تا نتیجه معکوس شود.
موفق و پیروز باشید…