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)。我想做的是:

  • 在两个数组或所有 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 问题。这里仍然有些不清楚的一件事是如果找到超过 3 个匹配项该怎么办,因此您可能必须修改上述内容以满足您的需要。

这是一个要点这是生成的输出

于 2013-01-08T10:01:49.347 回答