AMcoder - javascript, python, java, html, php, sql

PHP տեսակավորել օբյեկտը usort-ով, որը հիմնված է երկու արժեքների վրա

Ես փորձում եմ տեսակավորել իմ օբյեկտների զանգվածը՝ հիմնվելով նվազագույն SUMի վրա: Սա աշխատում է, բայց ես ուզում եմ իմ usort ֆունկցիային ավելացնել ևս մեկ համեմատություն, որը կնախընտրի օբյեկտը, որը կունենա մեկ true արժեք: Իմ օբյեկտները.

object(Basket)[33]
      public 'products' => 
        array (size=2)
          0 => 
            object(Product)[13]
              public 'name' => string 'Name ONE' (length=8)
              public 'price' => float 0.75
              public 'exist' => boolean true
          1 => 
            object(Product)[7]
              public 'name' => string 'Name TWO' (length=8)
              public 'price' => float 2.39
              public 'exist' => boolean true
      public 'sum' => float 3.14

object(Basket)[34]
      public 'products' => 
        array (size=2)
          0 => 
            object(Product)[19]
              public 'name' => string 'Name ONE' (length=8)
              public 'price' => float 0.75
              public 'exist' => boolean true
          1 => 
            object(Product)[72]
              public 'name' => string 'Name TWO' (length=8)
              public 'price' => null
              public 'exist' => boolean false
      public 'sum' => float 0.75

object(Basket)[35]
      public 'products' => 
        array (size=2)
          0 => 
            object(Product)[1]
              public 'name' => string 'Name ONE' (length=8)
              public 'price' => float 0.75
              public 'exist' => boolean true
          1 => 
            object(Product)[2]
              public 'name' => string 'Name TWO' (length=8)
              public 'price' => float 1.75
              public 'exist' => boolean true
      public 'sum' => float 2.5

Եվ եթե ես sort սա, ապա կարգը Basket[34],Basket[35],Basket[33] է:

Բայց ես ուզում եմ Basket[35],Basket[33], իսկ վերջում՝ Basket[34], քանի որ նա ունի 1 ապրանք, որը չկա։

Այսպիսով, ես ուզում եմ պատվիրել ապրանքի առկայության հիման վրա, իսկ հետո sort_ից SUM: Ես ունեմ սա, բայց դա չի աշխատում.

usort($h_basket[$i], function($a, $b) {
    return $a->sum > $b->sum;
});
usort($h_basket[$i], function($a, $b) {
  $unfinded_a = 0;
  $unfinded_b = 0;
  foreach ($a->products as $product) {
    if(!$product->exist) {
      $unfinded_a++;
    }
  }
  foreach ($b->products as $product) {
    if(!$product->exist) {
      $unfinded_b++;
    }
  }
  if ($unfinded_a != 0 || $unfinded_b != 0)
  return $unfinded_b > $unfinded_a;
});

Հնարավո՞ր է դա անել usort-ով, թե՞ ես պետք է օգտագործեմ array_multisort-ը:


Պատասխանները:


1

«Գոյություն ունի» դաշտով տեսակավորելու համար (և ես ենթադրում եմ, որ սայլերի բոլոր ապրանքների ավելի մեծ տոկոսը, այնքան բարձր է այն պետք է տեսակավորվի)

Ես կառաջարկեի օգտագործել array_filter՝ պարզ հաշվարկելու համար, թե քանի ապրանք կա «գոյություն ունի» ընդդեմ ընդհանուրի, օրինակ.

$exists = count(
    array_filter(
        $object->products,
        function ($product) {
            return $product->exist;
        }
    )
) / count($object->products);

Այնուհետև համեմատեք հաշվարկված $exists արժեքը համեմատվող երկու զամբյուղների համար:

Բազմաթիվ դաշտերով տեսակավորելու համար (կա, և այնուհետև գումարվում է), կարծում եմ, դուք պետք է զանգահարեք usort-ին երկու անգամ, հակառակ հերթականությամբ. սկզբում տեսակավորեք ըստ sumայնուհետև ըստ exists-ի:

09.05.2016
  • Շնորհակալություն պատասխանի համար, բայց ես լավ չեմ հասկանում: Սա չի աշխատում. usort($h_basket[$i], ֆունկցիա ($a, $b) {վերադարձնել $a-›sum › $b-›sum; }); usort($h_basket[$i], ֆունկցիա ($a, $b) { $exists = count( array_filter( $a-›products, function ($product) { return $product-›exist; } ) ) / count( $a-›products $exists2 = count( array_filter( $b-›products, function ($product) { return $product-›exist; } ) / count($b-›products return $exists2); $ գոյություն ունի }); 09.05.2016
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..