0

これに4時間取り組んでいます。目が痛くなり始め、パラドックスで脳が疲れています。

これがセットアップです。3 つの配列:

  • 広告である投稿の配列

  • 通常の投稿の配列

  • 配列 1 から取得した取得位置の配列

広告配列には事前定義されたスポットがあります。

広告は基本的に投稿の通常の流れに統合されているため、2 つの配列をマージしました。投稿の自然な順序に基づいてすべての投稿にスポットを割り当て、広告に割り当てられたスポットを割り当てることさえできました. したがって、投稿の自然な位置に広告がある場合、その投稿の位置は 1 つ前に移動する必要があります。ストリームに広告が 1 つしかない場合、これは簡単です。しかし、事は任意の数の複数の広告のために設定されています。

そこで、配列内の各非広告要素の位置をバンプする方法を次に示します。私はこれを数回実行することができたと思います.追加の広告がある場合はカバーするはずですが、それは間違っていて神聖ではないようです.

私は自分の涙の味がうんざりしているので、誰かがこの問題を解決できるかどうか疑問に思っています.

if(in_array($newarray[$key]['position'],$taken)){ 

$newkey = ($newarray[$key]['position'] + 1);
$newarray[$key]['position'] = $newkey;
$taken[] = $newkey;

最後に、すべての位置が正しく割り当てられ、一意であるマージされた配列が必要です。

4

1 に答える 1

1

次の利用可能な位置番号を取得する再帰関数を作成することもできますが、少数の投稿と広告で作業している場合は、以下のようなものをすばやく簡単に作成できます。これは、ads および posts 配列の元のキーを保持する必要があることを前提としていることに注意してください。それを行う必要がない場合は、さらに単純化できます。

// Sample array of ads
$ads = array('ad1' => array('position' => 1),
             'ad2' => array('position' => 4),
             'ad3' => array('position' => 6),
             'ad4' => array('position' => 10));
// Identify ad positions
foreach ( $ads as $k => $v ) {
    $adPositions[$v['position']] = $v['position'];
}
// Identify available positions
$availablePositions = array_combine(range(1,100), range(1,100));
$availablePositions = array_diff_key($availablePositions, $adPositions);
// Sample posts
$posts = array('post1' => array('position' => false),
               'post2' => array('position' => false),
               'post3' => array('position' => false),
               'post4' => array('position' => false),
               'post5' => array('position' => false),
               'post6' => array('position' => false));
// Use first (lowest number) available position as post position
foreach ( $posts as $k => $v ) {
    $posts[$k]['position'] = array_shift($availablePositions);
}
// Merge arrays
$merged = array_merge($ads, $posts);
// Create list of positions for use with array_multisort
foreach ( $merged as $k => $v ) {
    $position[$k] = $v['position']; 
}
// Sort $merged by ['position']
array_multisort($position, SORT_ASC, $merged);

あなたにあげる:

Array
(
    [ad1] => Array
        (
            [position] => 1
        )

    [post1] => Array
        (
            [position] => 2
        )

    [post2] => Array
        (
            [position] => 3
        )

    [ad2] => Array
        (
            [position] => 4
        )

    [post3] => Array
        (
            [position] => 5
        )

    [ad3] => Array
        (
            [position] => 6
        )

    [post4] => Array
        (
            [position] => 7
        )

    [post5] => Array
        (
            [position] => 8
        )

    [post6] => Array
        (
            [position] => 9
        )

    [ad4] => Array
        (
            [position] => 10
        )

)
于 2013-10-25T18:02:16.657 に答える