大まかに言えば、次の形式の 2 次元配列があります。
$elements = array(  0 => array('typeA', 'desc'),
                    1 => array('typeB', 'desc'),
                    2 => array('typeA', 'desc'),
                    n => array('typeC', 'desc'));
どこtypeXで 5 つの可能性のうちの 1 つであり、desc何でもかまいません。最終目標は$elements、a を共有する 2 つの要素typeXが隣接しないように並べ替えられます。これが私の機能です:
function fixDbls($elems) {
    $final   = array();
    $singles = array();
    $doubles = array();
    $lastelem = null;
    foreach($elems as $elem) {
        if(!$lastelem) { // set this the first time through
            $lastelem = $elem[0];
            $singles[] = $elem;
        } else { //otherwise, sort!
            if($lastelem == $elem[0]) {
                $doubles[] = $elem;
            } else {
                $singles[] = $elem;
            }
        }
    }
    if ($doubles) {
            // I suspect this is where it all goes wrong, I am awful at recursion!
        $final = fixDbls(array_merge($singles, $doubles));
    } else {
        $final = $singles;
    }
    return $final;
}
これがうまくいかない理由を誰かが理解するのを手伝ってくれたら (コードだけでなく、私が間違った仮定をした場所や、この問題についての私の考えが私を裏切った場所など)、これを一般の人々にとってより一般的に役立つものにするのに役立ちます!)これまでになく、とても感謝しています。