PHP中一个数组算法的递归帮助

PHP中一个数组算法的递归帮助,php,recursion,similarity,Php,Recursion,Similarity,虽然这听起来像是一个数学/CS问题,但我相信有人会帮我解决这个问题 我有两张桌子,相似的桌子和物品。项目表包含以下数据: itemID itemName ------ ----- 1 A 2 B 3 C 4 D 5 E $data = array( array(1, 2), // item1 = 1, item2 = 2 array(1, 3), // item1 = 1, item2 = 3 ar

虽然这听起来像是一个数学/CS问题,但我相信有人会帮我解决这个问题

我有两张桌子,相似的桌子和物品。项目表包含以下数据:

itemID   itemName
------   -----
    1    A
    2    B
    3    C
    4    D
    5    E
$data = array(
   array(1, 2), // item1 = 1, item2 = 2
   array(1, 3), // item1 = 1, item2 = 3
   array(2, 1), // etc.
   array(2, 3),
   array(3, 1),
   array(3, 4),
   array(4, 1),
   array(4, 2),
);
以及相似性表:

item1  item2
-----  -----
   1   2
   1   3
   2   1
   2   3
   3   1
   3   4
   4   1
   4   2
从上面可以看出,ID=1的项1与ID 2,3的项2相似。ID=2的项1与ID 1,3的项2相似。这使得第1项也类似于第3项。现在,ID=3的项1类似于4。这意味着ID1的项目1与1,2,3,4相似,但与5不同

我已经尝试过在这个想法上做一个算法。完整代码发布在下面。 它不起作用。有人有足够的灰质来解决这个问题吗

<?php
$server = 'localhost:3306';
$username = 'root';
$password = '';
$databasename = "test";
mysql_connect($server, $username, $password) or die('Error connecting to MySQL');
mysql_select_db($databasename);
function getSimilarities ($inddex, $prepared_stack1)  //this function returns the array of item2 given Item1
{
    $link = mysqli_connect('localhost', 'root', '', 'test');
    /* check connection */
    if (! $link) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    $stmt = mysqli_prepare($link, 
    "SELECT
                items.itemName
        FROM similarityTable
        INNER JOIN items ON similarityTable.item2 = items.itemID
        WHERE item1 = ?");
    mysqli_stmt_bind_param($stmt, 'i', $inddex);
    mysqli_stmt_execute($stmt);
    $rows = array();
    $row = new stdClass();
    mysqli_stmt_bind_result($stmt, $row);
    while (mysqli_stmt_fetch($stmt)) {
        $rows[] = $row; //contains array of what we want
    }
    printArray($rows);
    return X($rows, $prepared_stack1);
}
function X ($stack, $prepared_stack1) //This is my recursive function
{
    if (empty($stack)) {}else{

        $i = $stack[0];
        echo $i;
        $a = array_pop($stack);
        if (in_array($i, $prepared_stack1)) {
                    echo "smthg";       
        } else {
            array_push($prepared_stack1, $i);
            X(getSimilarities($i), $prepared_stack1);
        }
    }
    return $prepared_stack1;
}

function printArray($array){
    foreach ($array as $value) {
    $new1[] = $value;
}
$query = "(" . implode(",", $new1) . ")";
echo "<b>" . $query . "</b>";
}

/////////////////////////////
$prepared_stack = array();
$myArray = getSimilarities(1, $prepared_stack);

mysql_close();
?>

包含以下数据:

itemID   itemName
------   -----
    1    A
    2    B
    3    C
    4    D
    5    E
$data = array(
   array(1, 2), // item1 = 1, item2 = 2
   array(1, 3), // item1 = 1, item2 = 3
   array(2, 1), // etc.
   array(2, 3),
   array(3, 1),
   array(3, 4),
   array(4, 1),
   array(4, 2),
);
如果要检查每个项与哪些项相似,无需递归,只需执行以下操作:

$similarity = array();
foreach ($data as $item) {
    $id = $item[0];
    if (isset($similarity[$id])) continue;

    $array = array();
    foreach ($data as $sim) {
        list($item1, $item2) = $sim;
        if ($item1 == $id) $current = $item2;
        else if ($item2 == $id) $current = $item1;
        else continue;
        if (!in_array($current, $array)) $array[] = $current;
    }
    $similarity[$id] = $array;
}
这将为您提供一个数组,每个键都是一个项目ID,其中包含一个数组:

Array
(
    // item 1 is similar to 2,3,4
    [1] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 4
        )

    // item 2 is similar to 1,3,4
    [2] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 4
        )

    // and so on...
    [3] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 4
        )

    // etc.
    [4] => Array
        (
            [0] => 3
            [1] => 1
            [2] => 2
        )
)

简单的想法(可能不是很有效):将相似性表的条目视为图中的边,并使用Floyd Warshall计算顶点之间的最短距离。这样你就可以很容易地看到“类似”的过渡结尾。你到底想要什么样的输出?非常感谢你的努力。碰巧,你的建议没有完全解决问题。然而,您的代码给了我一个极好的提示,告诉我如何继续解决这个问题。我使用了list函数,这被证明非常有用。我已经发布了我的代码,以便对其他人有用。非常感谢!