You know the feeling. You're three callbacks deep in array_map , you tack on array_filter , then array_values to fix the keys, and PhpStorm gives up and types everything as array . PHPStan was useful five lines ago. Now it's just nodding politely. I spent six months of weekends building a library to fix this. It's called noctud/collection , it's PHP 8.4+ only, and this post is about why. The everyday pain Here's a scene that probably looks familiar: $activeAdmins = array_values ( array_filter ( array_map ( fn ( $u ) => $u -> refresh (), $users ), fn ( $u ) => $u -> isActive () && $u -> isAdmin () ) ); Enter fullscreen mode Exit fullscreen mode Three problems packed into one expression. Read order fights execution order. Your eyes hit array_values first, but it runs last. You parse the code in the opposite direction it executes, every time, forever. Types collapse. array_filter returns array<int, User> . array_values returns array<int, User> .…