Atkal uzdevumiņš PHP programmētājiem

Šodien rakstot kārtējo kodu gabalu nonācu līdz situācijai, kad bija jāsakārto masīvu, vadoties pēc kādas noteiktas tā vērtības. Pirmajā minūtē pat nevarēju iedomāties kā lai to izdara. Protams, pēc vēl minūtes apjukums bija pazudis un kods uztapa. Secināju, ka vajadzētu atkārtot klasiskos algoritmus. Ievadu esmu devis. Tagad pats uzdevums. Jums arī piedāvāju uzrakstīt sortēšanas kodu. Lai būtu interesantāk – visas atbildes tiks turētas moderēšanas režīmā 2 dienas. Tas tā – lai citi nešpiko. Pēc šī laika atbildes aktivizēšu. Interesanti būtu redzēt – vai citi izmantotu to pašu algoritmu kuru es – vai pavisam kaut ko citu. Protams, savus variantus var rakstīt arī tie, kas programmē citās valodās, jo uzsvars ir nevis uz konkrētu valodu, bet algoritmu. Un jā – nav arī jēgas tagad atvērt kādu manuāli un uzrakstīt algoritmu. Rakstiet tā kā varat izdomāt.

Tātad uzdevums. Ir dots masīvs ar nenoteiktu skaitu elementu. Indeksi ir no 0 līdz X, pieaugot pa 1. Vērtības ir masīvi. Šiem vērtību masīviem viens no indeksiem ir ‘value’, savukārt vērtība pie attiecīgā indeksa ir Y. Y ir kaut kāds pozitīvs skaitlis.
Piemērs diviem no iespējamajiem veidojumiem:

$data[0]['value'] = 12;
$data[0]['title'] = 'Some title';
$data[1]['value'] = 43.3;
$data[1]['title'] = 'Some title2';

Masīvu ir jāsakārto tā, lai [‘value’] lauki būtu dilstošā secībā. Tātad piemērā $data[0] vērtība ir jāapmaina vietām ar $data[1] vērtību. Pēc sortēšanas nedrīkst būt pazuduši kādi no masīva uzbūves noteikumos iekļautajiem ierobežojumiem. Piemēram, $data masīva indeksiem joprojām jābūt no 0 un pieaugošiem pa 1.

Ja gadījumā galīgi nav skaidrs uzdevums – sakiet par to komentāros – mēģināšu paskaidrot.

Flattr this!

19 comments

  1. Pitons, jo php nav pa rokai un nav arī simts gadus lietots.
    x = [ {“value”: 12, “title”:”Some title”}, {“value”: 43.3, “title”:”Some title2″} ]
    x.sort(lambda a, b: (a[“value”] < b[“value”]) – (b[“value”] < a[“value”]))

    Iekš php laikam sākumā izveidotu asociatīvu masīvu, kur atslēgas ir tie “value”, tad ksort un gatavs.

    Ja vien neesi pašreizējs CS students, tad riteni izgudrot nav sevišķi prātīgi, labāk lietot vides jau piedāvātās iespējas.

  2. Easy. Tur pat nekādu algoritmu nevajag:
    usort($data, create_function(‘$a,$b’, ‘return $b[“value”] – $a[“value”];’));

  3. rakstu bez koda – loģikā, uz sitiena nav, kur notestēt + baigais lauziens.

    Kā darītu es.

    1. ietu cauri masīvam pie viena izveidojot jaunu masīvu, kura key būtu value vērtība, bet saturs – jau iepriekš minētais masīvs ar value un title.

    aptuveni šitā:
    $newArray[‘43,3′] [1][‘value’] = 43,3;
    $newArray[‘43,3′] [1][‘title’] = ‘some title 2′;
    $newArray[12][0][value]=12;
    ……

    tad $newArray sakārtotu pēc atslēgām un beigu beigās atgrieztu veco masīvu.

    Tas tā, ja sapratu pareizi uzdevumu.

  4. Sis tacu ir pavisam trivials uzdevums.

    Kas ir

    $data[0]['value'] = 12;
    $data[0]['title'] = 'Some title';

    Tas ir

    $data = Array(0 => Array('value' => 12, 'title' => 'Some title'))

    Tad nu trivialais atrisinajums, izmantojot usort():

    function trivial_sort($a, $b) {
    $aa = $a['value'];
    $bb = $b['value'];
    if ($aa > $bb) return -1;
    else if ($aa < $bb) return 1;
    else return 0;
    }

    usort($data, 'trivial_sort');

    Peteris Krumins savā blogā raksta par: Analyzing Keyword Activity on Coding Horror

  5. Pirmkārt – prieks, ka bija tik daudzas atbildes.
    Pats es attiecīgo uzdevumu atrisināju ar bublesort. Par usort kaut kā niedomājos, bet tas būtu prātīgāks risinājums.

  6. Jebkurš variants, kas neizmanto iebūvētās php funkcijas (XXXsort) ir slikts. Jo tas ir lēns un neefektīvs. php iebūvētās kārtošanas funkcijas ir rakstīts C valodā, turpretī visi jūsu burbuļ/quick/insert/whatever-sorti būs lēnāki, jo būs php baitkods.

    Ir jāzin savas programmēšanas vides standartbiblotēku! Citādi taps slikts kods – gan tādā ziņā, ka ir iespējas ielaist vairāk kļūdas (nekā vienkārši izsaucot iebūvētu funkciju), kā arī tādā ziņā, ka citiem darba kolēģiem tu sagādā vairāk darba (viņiem tā vietā lai izlasītu iebūvētas funkcijas izsaukumu, ir jāvelta laiks un jāiebrauc svešā kodā).

  7. Protams, bubu tev ir 100% taisnība. Pats arī sajutos mazs dumjš iesācējs, kad lasot komentārus pamanīju usort(). It kā agrāk biju attiecīgo lietu izmantojis, bet tā kā jau stipri sen neko tādu nevajadzēja darīt, tad nebija pirmais kas ienāca prātā. Tā ir, ka brīžiem kodēšanas uzdevumi panesās stipri vienveidīgi un primitīvi. Persona sāk ierūsēt.

  8. ja kļūst garlaicīgi, tad tu tur kaut ko haltūrē. Programmēšanas sāls jau ir tas, ka tu noprogrammē vienreiz, lai nebūtu kaut kas ar rociņām jādara vēlreiz. Varbūt jāskatās kādu framework-u un bibliotēku virzienā..

  9. 2 cu: man pēdējā laikā nākas labot dažādus sen paša, kā arī citu rakstītus kodus. Kuri strukturāli ir ļoti vienkārši: datu atlase, datu izvade, datu ievietošana. Nekas tāds, kur vajadzētu ļoti saspringt domājot kā to panākt. Savukārt veco lietu labošanā izmantot freimworkus ir nereāli. Taču paralēli dažādiem elementārajiem darbiem tagad cītīgi apgūstu Zend Framework. Nākamo projektu, kuru taisīšu no 0 noteikti taisīšu uz ZF.

  10. Pirmais, kas ienāca prātā arī bija usort, vienīgais, ka nāktos atvērt manuāli, lai sev atgādinātu, kā funkciju pielietot.

  11. Uzreiz skaidrs ka var izmantot usort, paskatijos pec shis domas komentaaros – tik tieshaam cilveeki arii taa domaa :) Ljoti biezhi sanaak sorteet shaada tipa masiivus.

Iekomentē