2

各レベルが整数で表される階層 (アウトラインのような) (たとえば、最初のレベルは 0、2 番目のレベルは 1、任意の時点で前のレベルで新しいポイントを開始できます) を考えると、数値がスキップされないように整数を再割り当てしますが、同時に元の関係を尊重します。入力を配列として表しました。

$stuff = array(0,1,2,2,4,1,9,9,10,3,8,4);

目的の出力 (配列として表される場合) は次のとおりです。

$stuff = array(0,1,2,2,3,1,2,2,3,2,3,3);

ルールは次のとおりです。

  • 指定された値が最も近い以前の値と同じである場合、出力値は最も近い事前の出力値と同じである必要があります
  • 指定された値が最も近い以前の値よりも高い (つまり、より深い) 場合、出力値は最も近い事前の出力値よりも 1 大きくなります。
  • 指定された値が最も近い前の値よりも低い (つまり、浅い) 場合、指定された値よりも小さい最も近い前の値を見つけ、出力値はその値よりも 1 大きい必要があります。

私がこれを行うと考えた唯一の方法は、再帰によるものです。そして、前述の入力配列の最後のケースを除くすべてのケースで機能させることができます。入力配列の最後のケースを「4」ではなく「5」に変更すると、機能します。

ここに私がしようとしているものがあります:

<?php

$input = array(0,1,2,2,4,1,9,9,10,3,8,4);
$debug = false;
for ($i =0; $i < count($input); $i++) {
    if ($debug) {
        echo '<hr />Old level: '.$input[$i];
        $newLevel = newLevel($input,$i,$input[$i],$debug);
        echo '<br />New level: '.$newLevel.'<br /><br /><br /><hr />';
    }
    else {
        echo 'Old level: '.$input[$i].'; New level: '.newLevel($input,$i,$input[$i],$debug).'<br />';
    }
}

function newLevel($input, $index,$origValue,$debug) {
    if ($index == 0) return 0;
    else {
        if ($input[$index] > $input[$index-1]) {
            if ($debug) echo '<br />Orig value: '.$origValue.' in else/if';
            return newLevel($input,$index-1,$origValue,$debug)+1;
        }
        elseif ($input[$index] == $input[$index-1]) {
            if ($debug) echo '<br />Orig value: '.$origValue.' in else/elseif1';
            return newLevel($input,$index-1,$origValue,$debug);
        }
        elseif ($input[$index] < $input[$index-1]) {
            for ($i = $index-2; $i >= 0; $i--) {
                if ($input[$index] == $input[$i]) {
                    if ($debug) echo '<br />Orig value: '.$origValue.' in else/elseif2/for/if';
                    return newLevel($input,$i,$origValue,$debug);
                }
                elseif ($input[$index] == ($input[$i] + 1)) {
                    if ($debug) echo '<br />Orig value: '.$origValue.' in else/elseif2/for/elseif';
                    return newLevel($input,$i,$origValue,$debug);
                }
            }
                die ("Error with going to outer level -- should never hit this.");
        }
    }
}

?>

これは私が望む出力です:

Old level: 0; New level: 0
Old level: 1; New level: 1
Old level: 2; New level: 2
Old level: 2; New level: 2
Old level: 4; New level: 3
Old level: 1; New level: 1
Old level: 9; New level: 2
Old level: 9; New level: 2
Old level: 10; New level: 3
Old level: 3; New level: 2
Old level: 8; New level: 3
Old level: 4; New level: 3

しかし、私が得ている出力には、最後の行の新しいレベルの「2」があります。どんな助けでも大歓迎です。

4

1 に答える 1