如何从DB获取重复条目,而不是只获取一次?

时间:2016-01-22 16:23:23

标签: php mysql arrays database mysqli

我从数据库中提取有关项目的信息。

每个不同的项目都有自己的索引号:

$product[$x]

如果我列出项目两次(参见代码中的banana),则只会创建一个索引号。

如何为每个项目创建索引编号,而不管该项目是否已被调用?

<?php
include 'connect.php'; //

// Choose Relevant Items, and turn them into an array
$item_array = array(
'apple',
'banana',
'banana'
);

//implode items, turn into string
$item_implode = join("','", $item_array);

//declare an overall array for result
$product = array();

$productList = array();
$result = $mysqli->query("SELECT Name, Status as item_status from item_table where Name IN ('$item_implode') ORDER BY FIELD (Name, '$item_implode');");

if ($result->num_rows > 0) {
    $x = 1;
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $product[$x]["Name"] = $row['Name'];
        $product[$x]["item_status"] = $row['item_status'];

        $x = $x + 1;
    }
} else {
    echo "0 results";
}


// test print all avaialable database values
for ($i=1; $i <= count($product); $i++) { 
    echo $product[$i]["Name"] . " - ";
    echo $product[$i]["item_status"] . "<br/>";
}

使用当前代码$product[3](我希望banana不存在,因为代码似乎自动删除重复项。 我不想让它删除。

我的动机是,稍后在代码中,我可能希望在两个变体中显示相同的项目,当我显示项目时,我使用在项目索引号上运行的循环。因此,对于我$item_array中当前出现的任何项目,循环将没有任何内容可以运行,除非代码将被更改,以便根据我放在我的数组中的内容得到重复。

修改

更新了工作代码:

<?php

include 'connect.php';

// Choose Relevant items, and turn them into an array
$item_array = array(
'apple',
'banana',
'carrot',
'banana',
'carrot',
'berry'
);

//implode items, turn into string
$item_implode = join("','", $item_array);

//declare an overall array for result
$product = array();

$result = $mysqli->query("SELECT Name, Status as item_status from item_table where Name IN ('$item_implode') ORDER BY FIELD (Name, '$item_implode');");

// New Code:

while($row = $result->fetch_assoc()) {


    $fruit_name = $row['Name'];
    // next you need to find all keys in $item_array which value is the fruit
    $keys = array_keys($item_array, $fruit_name);
    foreach ($keys as $key) {

        // add values for these keys
        $product[$key+1]['Name'] = $row['Name'];
        $product[$key+1]['item_status'] = $row['item_status'];

    }
}

/* REPLACED CODE: //////////////////////////

if ($result->num_rows > 0) {
    $x = 1;
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $product[$x]["Name"] = $row['Name'];
        $product[$x]["item_status"] = $row['item_status'];

        $x = $x + 1;
    }
} 


else {
    echo "0 results";
}*/

/////////////////////////////////////////////

// test print all avaialable database values
for ($i=1; $i <= count($product); $i++) { 
    echo $product[$i]["Name"] . " - ";
    echo $product[$i]["item_status"] . "<br/>";
}

1 个答案:

答案 0 :(得分:2)

首先 - 不需要搜索重复的项目。 您当前的查询是:

SELECT Name, Status from item)table where Name IN ('apple', 'banana', 'banana')

多余

在创建array_unique时执行$item_implode

$item_implode = join("','", array_unique($item_array));

这会使$item_array保持不变,但会减少您的查询。

接下来,如果我说得对,你需要db中的一个项目来查询。这意味着如果在db中有几个香蕉,则只应在$product中放置一条记录。好的,这样做:

$founded_fruits = array();
// special array to track founded fruits
if ($result->num_rows > 0) {
    $x = 1;
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // I suppose that `$row['Name']` is name of a fruit
        if (!in_array($row['Name'], $founded_fruits)) {
            $founded_fruits[] = $row['Name'];
            $product[$x]["Name"] = $row['Name'];
            $product[$x]["Status"] = $row['Status'];
        }

        $x = $x + 1;
    }
} else {
    echo "0 results";
}

<强>更新即可。好的 - 你希望products中的水果出现与$item_array中出现的水果相同。试试这个:

$product = array();
while($row = $result->fetch_assoc()) {
    $fruit_name = $row['Name'];
    // next you need to find all keys in $item_array which value is the fruit
    $keys = array_keys($item_array, $fruit_name);
    foreach ($keys as $key) {
        // add values for these keys
        $products[$key]['Name'] = $row['Name'];
        $products[$key]['item_status'] = $row['item_status'];
    }
}