Advent of code 2018/5
Ajax Direct

Answer

Part 1 :
Part 2 :
$repl = (array) set(range("a", "z"))->map(fn ($l) =>
    [$l . strtoupper($l), strtoupper($l) . $l]
)->merge();

// React item until no more reactions are possible
function react($item, $repl) {
    $reaction = str_replace($repl, "", $item);
    if ($reaction === $item) return $reaction;
    return react($reaction, $repl);
}

// ==================================================
// > PART 1
// ==================================================
$solution_1 = strlen(react($input->string, $repl));

// ==================================================
// > PART 2
// ==================================================
$solution_2 = set(range("a", "z"))->map(fn ($l) =>
    strlen(react($input->replace($l, "")->replace(strtoupper($l), "")->string, $repl))
)->min();