0

クライアントのロビーで使用するメッセージ ボードを開発しています。

「ランダウン」は PHP から作成された JSON であり、5 分ごとに AJAX 呼び出しによって更新がチェックされます。ランダウンは、項目、その期間、および開始時刻と終了時刻を含む MySQL データベースから取り込まれます。JQuery はコンテンツを繰り返し処理し、データの先頭までループします。現在、リスト内で繰り返されるアイテムはありません。

重み付けシステムが要求されたので、重要なアイテム ($$$ クライアント、スタッフ会議など) が存在する場合、(ループが発生するまで 1 回だけではなく) より頻繁にリストに表示されます。

データベースに重み列を追加しましたが、最終的な配列ビルドでそれを実装する方法がわかりません。

$i = 0;
foreach ($rundown_standard as $item) {
            $return[$i]["playlist_id"] = $i;
            $return[$i]["item_id"] = $item["id"];
            $return[$i]["weight"] = $item["weight"];
            $return[$i]["duration"] = $item["duration"];
            $return[$i]["template"] = $item["template"];
            $return[$i]["headline"] = htmlentities($item["headline"]);

        $content = $helper->isJson($item["content"]);
        if ($content) {
            $return[$i]["content"] = $content; 
        } else { 
            $return[$i]["content"] = str_replace(array('{images_path_absolute}', '{images_path_relative}'), array(IMAGES_PATH_ABSOLUTE, IMAGES_PATH_RELATIVE), $item["content"]);
        }

    i++;
}

$returnこの関数を呼び出す関数に送信するフォーマット済みデータです。

デフォルトの重みは です0。これは、配列に追加された順序で 1 回だけ表示され、90他のすべての項目の後に の重みを持つものが表示されることを意味します。

別のカウンター変数を設定してから、アイテムを挿入してカウンターをリセットしようとしました。

泥のように透明?

アドバイスをありがとう。

編集 17:45: JavaScript は、ページを動的に更新するためのものです。JSON を繰り返し処理し、次の項目をリストに追加します。

if (window.item_content[i].template == "1") {
    return '<div class="featured-item" id="featured-item-'+window.item_content[i].playlist_id+'"><img src="'+window.item_content[i].content+'" /></div>';
}

私の問題があるのは配列です。挿入する要素が複数ある場合、指定された間隔で要素を挿入するにはどうすればよいですか。

4

1 に答える 1

1

コーディング方法を知っているようで、アルゴリズムが必要なだけなので、疑似コードをいくつか紹介します。より良いコードに変換する必要がある場合は、そうすることができます。

  1. と の 2 つの配列returnを操作しhighPriorityます。 return体重は気にしませんが、気にしませんhighPriority
  2. 指定されたリストを反復処理し、すべての 0 の重みを に入れ、returnその他すべてを に入れhighPriorityます。
  3. highPriority重みの低いものから高いものの順に並べ替えます。
  4. の各アイテムについてhighPriority、数学は簡単に終わりますが、典型的な「正規化とスケーリング」操作から来ています。重みを正規化し ( n = weight / 90)、次に配列のサイズにスケーリングし( )、n *= return.length追加するアイテムの数を見つけます。配列。return次に、配列内のアイテムを分散するために必要なスペースを見つけるには、return.length / n. 90/weightただし、これは単純に に要約されます。

    1. var step = 90 / item.weight;
    2. for (var i = 0; i <= 90; i += step) place item at i[step]

注意事項:

  • これらは優先度が低く、存在する必要があるのは 1 回だけであるため、重み 0 から始めます。
  • 他のすべてについては、重みが大きいため、配列の先頭から開始します。
  • return.lengthstepは反復ごとに変化するため、計算した は各要素ごとに変化しますが、最も優先度の高いものを最後に追加しているため、依然として最も優先度が高くなります。
  • i <= 90これらの重み付けされた値が少なくとも 2 回表示されるようにするために使用します。のみi < 90で、重量が 1 の場合、アイテムは 1 つだけになる可能性があり、重量 1 は重量 0 とは異なるはずです。
  • 私はこのアルゴリズムを完全にはチェックしていません。ステップの計算では、いくつかまたは必要になる場合がありMath.floorます。Math.ceilingあなたのエッジケースをチェックしてください(私よりも良いです)!

それでうまくいくはずです。それが役に立てば幸い!

于 2013-04-16T14:24:39.543 に答える