-1

我在这里有一个数组:

Array
(
    [1] => Array
        (
            [id] => 1
            [items] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                        )

                    [1] => Array
                        (
                            [id] => 2
                        )
                    [2] => Array
                        (
                            [id] => 3
                        )

                )

        )

    [2] => Array
        (
            [id] => 2
            [items] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                        )
                    [1] => Array
                        (
                            [id] => 5
                        )

                )

        )

)

问题id:当项目进入第二个阵列时,如何重置项目?我一直在努力为此寻找算法,但找不到方法:(

如果有帮助,这是我如何获取数组的源代码。为了清楚起见,我简化了数组,下面的代码是扩展的:

$results = array();

$i = 0;

while ($row = mysql_fetch_assoc($result)) {
    $i++;
    $results[] = array(
                $row['id'] => array(
                            'category' => $row['category'],
                            'items' => array(
                                array(
                                    'id' => $i, //THIS IS THE PROBLEM
                                    'name' => $row['name'],
                                    'user_name' => $row['user_name'],
                                    'price' => $row['price'],
                                    'item_photo' => $row['item_photo'],
                                    'item_description' => $row['item_description']
                                )
                            )
                )
    );

}

// Begin rebuilding trees

$output = array();

//$results is array from mysql
foreach ($results as $data) {
    //var_dump($data);
    //dumping each block of array
    foreach ($data as $categoryId => $item) {
        //check if NOT yet set
        if (!isset($output[$categoryId])) {
            //insert values in the first Array()
            $output[$categoryId] = array(
                'id'       => $categoryId,
                'category' => $item['category'],
                'items'    => array()
            );
        }

        //populate 'items' array with stuff
        $output[$categoryId]['items'] = 
        array_merge(
            $output[$categoryId]['items'],
            $item['items']
        );
    }
}

如果有什么请告诉我。

4

2 回答 2

1

首先,也是最重要的,请不要使用mysql_*API,因为这些功能现在已被弃用。相反,请使用MySQLiPDO(我个人会使用 PDO,因为它支持各种数据库连接,但这只是我的看法)

解决问题所需要做的id就是将先前的 id 存储在变量中并对其进行测试。以下内容可能不正确,因为您的代码非常混乱,但应该足以让您走上正轨:

$i = 0;

while($row = mysql_fetch_assoc($result)){
    // Only increment i if it is still the same row
    // otherwise reset it
    if($row_id==$row['id']){
        $i++;
    }else{
        $i = 0;
    }
    // Set the new row id
    $row_id = $row['id'];
    // Do your stuff...
}
于 2013-10-22T07:16:28.643 回答
1

假设您的结果已排序,因此每个类别的项目都是连续的(一个类别不会出现在结果中的不同位置):

$oldCat = "";

while ($row = mysql_fetch_assoc($result)) {

// If the current category is different than the previous, reset $i
if ($row['category'] != $oldCat)
    $i == 0;

// Set $oldCat to the current categery (used for next loop's comparison)
$oldCat = $row['category'];

$i++;
$results[] = array(
       [ ... ]
)

}

此外,您可以将设置设置$i为单线:

// If the current category is different than the previous, reset $i
$i = $row['category'] != $oldCat ? 0 : $i++;

只是为了清楚起见,您可能想要制作更具描述性的数组键。例如,您有id两次 - 这可能是category_idand item_id

于 2013-10-22T07:17:02.723 回答