gpt4 book ai didi

php - 在 php 中生成独特的组合而不会耗尽内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:40 25 4
gpt4 key购买 nike

我正在编写一种算法来从数据库中生成项目组合。它们需要是唯一的排列(即 145、156 == 156、145)。我遇到的问题是如何跟踪以前的组合,这样我就不会以 145、156 和 156、145 结束。

目前我正在将它们添加到索引为 id1_id2 的数组中...(排序以便 id 始终从最低到最高)并在生成组合时将值设置为 1,以便我可以检查 $combos[ $index] 是否存在。如果它不存在,请创建它。 (还有其他标准可以剔除每个排列,但它们无关紧要)生成这些组合后,它们将存储在 MySQL 的表中。

我遇到的问题是,对于我正在使用的测试项目(大约 85 个),我无法在不耗尽内存的情况下生成超过 3 个项目(id1_id2_id3)的组合,因为组合的数量是巨大的,而且$combos 数组占用的空间超过了我在 PHP 内存中分配的 64M。

有没有一种方法可以让我做到这一点 a) 无需跟踪以前的组合或 b) 跳过 $combos 数组路由并只向 mysql 添加一个唯一行并让 mysql 处理重复检查。

下面是一些伪代码供引用:

$items = array(/*85 items*/);
foreach ($items as $item1){
generate(array($item1));
foreach($items as $item2){
generate(array($item1, $item2));
}
}
}

function generate($items_arary){
$temp_array = array();
foreach ($items_array as $item){
$temp_array[] = $item['id'];
}

sort($temp_array);
$index = implode("_", $temp_array);

if (!$combos[$index]){
$combos[$index] = 1;
/* some code to generate query to store to db */
}
}

查询最终看起来像这样:(数据库在脚本开头被截断)

INSERT INTO `combos` (combo_id, more_info) VALUES ('id1_id2', 'Item Name');

在写这道题的过程中,我想到了一个可能的解决方案:确保id3 > id2 > id1。这是否是消除对 $combos 需求的可行解决方案?

最佳答案

我问之前数据结构的原因是因为你可以做这样的事情:

$sql = "SELECT id FROM test_a";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
$item1 = $row['id'];

$sql2 = "SELECT id FROM test_a";
$result2 = mysql_query($sql2);
while ($row2 = mysql_fetch_array($result2)) {
$item2 = $row2['id'];

$combo1 = $item1 . "_" . $item2;
$combo2 = $item2 . "_" . $item1;

$sql3 = "SELECT * FROM combos WHERE combo_id = '$combo1' OR combo_id = '$combo2'";
$result3 = mysql_query($sql3);
if (mysql_num_rows($result3) == 0) {
$sql4 = "INSERT INTO combos (combo_id, more_info) VALUES ('$combo1','Item Name')";
$result4 = mysql_query($sql4);
}
}
}

当表 test_a 的值为 1、2、3 和 4 时,此脚本将插入:1_11_21_31_42_22_32_43_33_44_4

这应该不会有任何内存问题。尽管如果你有一个庞大的数据库,你可能会遇到 php 的时间限制问题

关于php - 在 php 中生成独特的组合而不会耗尽内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1207856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com