المساعدة في تحسين المكالمات إلى وظيفة Usort في PHP

StackOverflow https://stackoverflow.com/questions/2286793

  •  21-09-2019
  •  | 
  •  

سؤال

هذا هو رد الاتصال الخاص بي 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));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top