Php - 重置多维数组中的初始id

时间:2013-10-22 07:04:48

标签: php arrays

我在这里有一个数组:

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']
        );
    }
}

如果有的话请告诉我。

2 个答案:

答案 0 :(得分: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...
}

答案 1 :(得分: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_iditem_id