ちょっと悩みました。結局構造として、
- 指定された文字列が「最初に」出現した場所をつきとめる
 - 最初に出現した場所まですっぱりと文字列を削除
 - 文字列の残りを同じように判定
 - 出現する限りwhile文でまわし、出現回数をカウントする
 
という感じになっています。
ここまでの問題をすっとばしてfinal問題を解いてしまったので、これでよかったのかどうか。
ご参考になれば。

この問題のきもは「重複している」場合をどうするかですね。
AAAからAAを探すとき、paizaが要求している答えは「2」、
mb_substr_count関数を使ってしまうと答えは「1」になる(はず)
別の方法が必要ということになります。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!
    $s = trim(fgets(STDIN));
    $str = trim(fgets(STDIN));
    $count=0;//reset カウント
    
    while(strpos($str, $s) !== false){
        $pos = strpos($str, $s);
    
        $str = mb_substr($str,$pos+1,strlen($str)-$pos);
        $count++;
    }
    
    echo($count."\n");
    
?>
文字列内の部分文字列が最初に現れる場所を見つける strpos
https://www.php.net/manual/ja/function.strpos.php
paiza Bランクレベルアップメニュー(PHP編)
https://paiza.jp/works/mondai/prob60/problem_index?language_uid=php
お待ちしております!
1+