В 2024 году потребовалось на PHP написать функцию сортировки массива, при которой элементы для которых дан порядок сортировки, окажутся впереди в нужном порядке, а остальные останутся как есть. За пару тычков было написано следующее:
usort($categories, function($a, $b) use ($customAllSort) {
$indexA = array_search((int)$a->id, $customAllSort);
$indexB = array_search((int)$b->id, $customAllSort);
if ($indexA === false && $indexB === false) { return 0; }
if ($indexA === false && $indexB !== false) { return 1; }
if ($indexA !== false && $indexB === false) { return -1; }
return $indexA <=> $indexB;
});
Спустя триллион тычков оказялось, чтоонё нёнёнё роботоит потомушьто PHP<8.0.0.0.0.0 - элементы массива, не затрагиваемые сортировкой оказывались ПРОИЗВОЛЬНО ПЕРЕМЕШАНЫ нахуй.
Note: If two members compare as equal, they retain their original order. Prior to PHP 8.0.0, their relative order in the sorted array was undefined.
Вот спасибо, ебать, большое. Спустя тысячу тычков было написано следующее:
usort($categories, function($a, $b) use ($categories, $customAllSort) {
$indexA = array_search((int)$a->id, $customAllSort);
$indexB = array_search((int)$b->id, $customAllSort);
if ($indexA === false && $indexB === false)
{ return array_search($a,$categories) <=> array_search($b,$categories); }
if ($indexA === false && $indexB !== false) { return 1; }
if ($indexA !== false && $indexB === false) { return -1; }
return $indexA <=> $indexB;
});
И на локалхосте оно отработало. ХОВЕВЕР.
Fatal error: Nesting level too deep - recursive dependency? in /istochnik/nevrnogo/tika/ProductController.php on line 120
Скотомогильное уёбище натужно отыскало в этом коде рекурсию на строчке array_search($a,$categories) <=> array_search($b,$categories). Покажите мне, блядь, рекурсию в этом месте, нахуй. Рекурсия тут есть только в больной башке у шайтан-коробки с электронами.
Спустя десять тысяч тычков было написано следующее:
array_multisort(
array_map(
function($index, $category) use ($customAllSort) {
$position = array_search($category->id, $customAllSort);
return $position !== false ? $position : count($customAllSort) + 1 + $index;
},
array_keys($categories),
$categories
),
$categories
);
Вау! Оно того стоило! (нет, не стоило)
А день уже прошёл. А сутки жизни уже не вернуть. Вот это я классно обменялся! Ставьте лайки, пишите "нц ты и лох" в колмментрю.досвидня