2

3 つの PHP 配列内ですべての「ペア」と「トリプレット」を見つける方法がわかりません。私の配列は次のようになります。

Array
(
    [0] => Array
        (
            [sanitized] => lisa
            [original] => Lisa
            [weight] => 100
            [color] => blank
        )

    [1] => Array
        (
            [sanitized] => jack
            [original] => Jack
            [weight] => 93
            [color] => blank
        )
    ...

これらの配列は 3 つあります。これらは常に整数キーでソートされ、常に 10 個のインデックス (0 ~ 9) が含まれます。私がやろうとしていることは次のとおりです。

  • 2 つの配列または 3 つの配列すべてで (「サニタイズされた」フィールドを比較して) 同一の名前のインスタンスを見つけ、それらの「色」を同じになるように変更します (つまり、3 つすべての交点だけを見つけたくありません)。配列 - array_intersect で実行できます)
  • すべてのエントリを結合し、同じ名前を (「サニタイズされた」フィールドを比較して) 重みを合計して結合する 4 番目の配列を作成します (色は関係ありません)。
  • これらのタスクは似ているため、同時に実行し、複雑さを最小限に抑えたいと考えています

これは説明が難しいので、視覚的に表現しました。

色:

色 http://www.tsiomenko.com/1.png

重み:

ウェイト http://www.tsiomenko.com/2.png

私はいくつかの実用的なコードを持っていますが、それは本当に長くて醜く、N^3 のような複雑さがあります - ネストされた for ループを使用して、必要なものが得られるまですべての配列を複数回トラバースします。私は非常に小さな配列で作業していますが、他の人がこの問題にどのようにアプローチするのか興味があるので、これを効率的に行う方法を知りたいです。PHP の代わりに、この問題へのアプローチ方法に関する疑似コードを歓迎します。

4

1 に答える 1

1

次のループにより、必要な出力が得られるはずです。

// loop once to build the combined array and set the colors
foreach ($names as &$name) {
    if (!isset($combined[$name['sanitized']])) {
        $combined[$name['sanitized']] = array(
            'original' => $name['original'],
            'weight'   => $name['weight'],
            'color'    => array_pop($colors),
            'count'    => 1,
        );
    } elseif ($combined[$name['sanitized']]['count'] < 3) {
        $combined[$name['sanitized']]['weight'] += $name['weight'];
        $combined[$name['sanitized']]['count']++;
    }

    $name['color'] = $combined[$name['sanitized']]['color'];
}


// loop again to blank any colors where name only appeared once
foreach ($names as &$name) {
    if ($combined[$name['sanitized']]['count'] === 1) {
        $combined[$name['sanitized']]['color'] = $name['color'] = 'blank';
    }
}

SOの質問がたくさんあるカラージェネレーターは省略しました。ここで不明な点が 1 つあります。それは、3 つ以上の一致が見つかった場合の対処法です。そのため、ニーズに合わせて上記を変更する必要があります。

ここに Gist があり、ここに生成された output があります

于 2013-01-08T10:01:49.347 に答える