3

Doctrine 1.2.4、mysql、Zend (問題とは関係ありません) を使用して取り組んでいる php プロジェクトがあります。管理パネルから、チーム ページのチーム メンバーの外観をポジションごとに変更できるという新しい要件がありました。

だから私は位置のint列をテーブルに追加しました。ここでの主な問題は、位置を変更して順序を維持することです。私は頭を悩ませていて、php で配列を使用して回避策を見つけましたが、バグがあります。ここに私の方法があります: 位置をキーとして、id を値として配列に選択し、その配列の並べ替えに取り組み、再配置された配列に基づいてテーブルを再更新します。ここに私のコードがあります:

//here i use string as my id to be able to view the changes .  
//you can swap to this:
  $anarray = array("23", "12", "4", "6", "2");
//$anarray = array("car", "dog", "cow", "cup", "plane");

var_dump($anarray);

function preserveSort($oldposition, $newposition, $arraytosort) {
  // this assumes that there is no zero in position
  $oldposition--;$newposition--;
  $indice = $newposition - $oldposition;
  $tmpNewPosistionData = $arraytosort[$oldposition];
  if ($indice > 0) {

      for ($i = $oldposition; $i < $newposition; ++$i) {
          echo $i . "<br/>";
          $arraytosort[$i] = $arraytosort[$i + 1];
      }
  } else {
      for($i=$oldposition;$i >$newposition; $i--){
          echo $i."<br/>";
          $arraytosort[$i] = $arraytosort[$i-1];        
      }
  }
  $arraytosort[$newposition] = $tmpNewPosistionData;
  var_dump($arraytosort);
}

echo "<br/>";
echo "changing position 1 to 4 <br/>";
preserveSort(1, 4, $anarray);

私はそれが完全に機能する可能性があると思っていましたが、いくつかの試行の後、位置が混乱しています. すでにこの問題を解決した人がいるのだろうかと思っています。はいの場合、私は少し助けていただければ幸いです

これを読んでくれてありがとう

4

1 に答える 1

0
function move_element($input, $from, $to) { // I suggest $input as first paramter, to match the PHP array_* API
    // TODO: make sure $from and $to are within $input bounds
    // Assuming numeric and sequential (i.e. no gaps) keys
    if ($from == $to) {
        return $input;
    } else if ($from < $to) {
        return array_merge(
            array_slice($input, 0, $from),
            array_slice($input, $from +1, $to - $from),
            array($input[$from]),
            array_slice($input, $to +1, count($input) - $to)
        );
    } else if ($from > $to) {
        return array_merge(
            array_slice($input, 0, $to),
            array($input[$from]),
            array_slice($input, $to, $from - $to),
            array_slice($input, $from +1, count($input) - $from)
        );
    }
}
于 2012-06-16T09:48:59.603 に答える