المساعدة في تحسين المكالمات إلى وظيفة Usort في PHP
سؤال
هذا هو رد الاتصال الخاص بي usort()
public function sortProperties($a, $b) {
$sortA = inflector::camelize(str_replace('-', '_', $this->sortBy));
$sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));
$a = Arr::get($a, $sortA);
$b = Arr::get($b, $sortB);
if (is_numeric($a) AND is_numeric($b)) {
return $a < $b;
} else {
return strcasecmp($a, $b);
}
}
عادة ، عندما أرى الخطين الأولين في أي من الكود الخاص بي ، يصرخ لي: ريب أعتقد أن ذلك لأنها متطابقة.
أعلم أنه يمكنني جعل وظيفة getCamelized()
, ، لكنني لا أعتقد أنني سأستخدمه مرة أخرى خارج هذا.
هل هناك طريقة لتحويل هذه الخطوط الأربعة إلى 2؟ يستطع func_get_args()
أو array_walk()
ساعدني هنا؟
أيضا ، هل هناك أي خطأ في وظيفة الفرز هذه؟
المحلول
هل هناك طريقة لتحويل هذه الخطوط الأربعة إلى 2؟
$sortA = $sortB = inflector::camelize(str_replace('-', '_', $this->sortBy));
وبالنسبة لخطين آخرين:
list($a, $b) = array(Arr::get($a, $sortA), Arr::get($b, $sortB));
أما بالنسبة للفرز ، يبدو أنه على الأقل بالنسبة لي.
نصائح أخرى
$sortA == $sortB
لذلك الجزء هو مجرد ازدواجية. حساب $sortA
مرة واحدة أينما كنت $this->sortBy
. ال Arr::get
الخطوط التي عالق بها. ال return $a < $b;
يبدو خطأ ، يجب أن تعيد رقم -V ، 0 ، +VE.
...
function setSortBy($sortBy) {
$this->sortBy = $sortBy;
$this->sortByCam = inflector::camelize(str_replace('-', '_', $sortBy));
}
....
public function sortProperties($a, $b) {
$a = Arr::get($a, $this->sortByCam);
$b = Arr::get($b, $this->sortByCam);
if (is_numeric($a) && is_numeric($b)) {
return $a - $b;
} else {
return strcasecmp($a, $b);
}
}
شئ مثل هذا. الفكرة الرئيسية لإخراج الجزء الجمال من الحلقة.
كن حذرا ان strcasecmp
سيعود int (1 أو 0 أو -1) و <
سيعود منطقية. تحتاج حقًا إلى استخدام واحد أو آخر. لاحظ أيضا ذلك strnatcasecmp
من المحتمل أن يعطيك السلوك الذي تريده لكل من الأرقام والسلاسل ، لذا جرب هذا:
public function sortProperties($a, $b) {
$aInflected = Arr::get($a, $sort = inflector::camelize(str_replace('-', '_', $this->sortBy)));
return strcasecmp($aInflected, Arr::get($b, $sort));
}