各レベルが整数で表される階層 (アウトラインのような) (たとえば、最初のレベルは 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」があります。どんな助けでも大歓迎です。