Профил
Loading...
+ Нов въпрос
Hristo_Penchev avatar Hristo_Penchev 388 Точки

[Exam Problems] PHP Basics 29 Аугуст 2014 Evening - Problem {5} - array_multisort

Колеги,

сблъсках се с проблем с функцията array_multisort. Решавам четвърта задача от изпита на 29 август вечерта. Имам асоциативен масив. ТОй съдържа масиви, а всеки от масивите се състои от еднакви асоциативни масиви:


{"CPU":[{"product":"AMD A10-5800K X4 3.8GHz, 4MB Cache","price":"186.00","currency":"BGN"}],

"HDD":[{"product":"500GB Toshiba, SATA 6Gb\/s, 7200rpm, 32MB","price":"88.41","currency":"BGN"},{"product":"SSD 2.5\", 120GB, Corsair F120 LS, SATA3","price":"180.50","currency":"BGN"},{"product":"1TB Toshiba, SATA 6Gb\/s, 7200rpm, 32MB","price":"52.82","currency":"EUR"}],

"RAM":[{"product":"8GB DDR3L 1600 KINGSTON SODIMM","price":"87.00","currency":"USD"},{"product":"16GB Micro SDHC, A-Data, Class10","price":"15.03","currency":"BGN"}],

"motherboard":[{"product":"ASRock B75M-GL R2.0","price":"47.55","currency":"EUR"}]}

Искам да сортирам продуктите във всяка категория според името на продукта. Ето кода:

foreach ($priceList as $key => $category) { //Минаваме по всяка категория
    
    foreach ($category as $key=>$product) {
        $outputArr[$key] = $product['product']; //Правим масив от името на продуктите във //всяка категория
    }
    
    array_multisort($outputArr, SORT_ASC, $category); //Сортираме категорията по име на //продуктите
}

Получавам следната грешка при стартиране: Array sizes are inconsistent. Не мога да разбера къде бъркам. Ето линк към целия ми код:
http://pastebin.com/naqa62rX

 

Тагове:
-1
PHP Web Development Basics 19/12/2014 20:56:14
a.angelov avatar a.angelov 1317 Точки

Здравей,

тази задача и на мен не ми се получи с ползване на array_multisort /която всъщност е доста удобна функция за сортиране/. Мисля, че с нея няма как да бъде изпълнено и изискването: If multiple products have the same name, preserve their original order.

Затова с малко търсене в google намерих и ползвах ето този начин на сортиране, приложих я в твоя код и даде 85/100:

foreach ($priceList as $key => $row) {
usort($row, "cmp");
$priceList[$key] = $row;
}

function cmp($a, $b) {
if ($a['product'] == $b['product']) {
return 0;
}
return ($a['product'] < $b['product']) ? -1 : 1;
}


0
bojanm avatar bojanm 3 Точки
Пробвай това , но вече ми се спи да го тествам:


foreach($category as $k=>$v) {
$tmp['product'][$k] = $v['product'];
}
array_multisort($tmp['product'],SORT_ASC(ili string ),$category);


0
Hristo_Penchev avatar Hristo_Penchev 388 Точки

С usort стана. Опитах решението на bojanm, но не се получи. Не знам защо не работи тук мултисорт. Ако някой може да разбере, нека сподели.

0
Hristo_Penchev avatar Hristo_Penchev 388 Точки

Сортирането с usort го скалъпих, утре може да продължа да мъча мултисорт. Но сега имам проблем със седми тест. Едно на ръка, че според мен това е супер некоректно задаване. Никъде в условието не се споменава, че може да има празни висящи клетки, тоест задачата оценява не толкова знания и умения, колкото иска от нас да отгатнем какво е било в главата на автора. Но хайде, грешки стават, може да е забравил да го допише в условието.
Не мога обаче да измисля решение на задачата. Нито мога да разбера защо авторското решение работи. Единствената смислена разлика с моето решение е, че html_entity_decode се задава не в началото, когато четем текста, а след сплита при отделните елементи. Така вече работи. Все пак ще се радвам на помощ да схвана логиакта в нещата и да открия грешките си.

1
20/12/2014 02:07:47
Filkolev avatar Filkolev 4486 Точки

Аз едва от вчера се мъча с изпитни задачи, но това е основният проблем, който срещам - задачите се решават лесно само ако може да влезеш в главата на автора. Аз си правя някакви алгоритми, които уж отговарят на условието, минават нулевите тестове и след това получавам нещо от рода на 50-70 точки. Без да виждам някаква грешка в логиката си. След което поглеждам авторското решение и виждам, че единствената разлика е не в логиката и алгоритъма, а в конкретния регекс, който ползвам. Което е просто вбесяващо - нулевите тестове би следвало да ти помогнат, а не да те прецакват. Просто не мога да си обясня как уж спазвам всички изисквания на дадена задача и нищо нито в условието, нито в примерите ми помага да установя къде бъркам. 

Иначе за ексейпването - не еднократно се казва, че то се прави в последния възможен момент, т.е. при echo или нещо такова, не при запазването на данните в базата или при четене.

3