PHP在多维数组中更新数量

时间:2014-04-11 14:30:35

标签: php arrays multidimensional-array

我的数组如下所示:

Array
(
    [0] => Array
        (
            [index] => 0
            [quantity] => 1
            [0] => Array
                (
                    [id_product] => 20
                    [title] => Oranges
                )

        )

    [1] => Array
        (
            [index] => 1
            [quantity] => 1
            [0] => Array
                (
                    [id_product] => 24
                    [title] => Bananas
                )

        )

)

要制作这个数组,这是我的代码:

$i = 0;
$content = array();
if(isset($_SESSION['cart'])){

    foreach($_SESSION['cart'] as $result){

        foreach($result as $item){

            $values = $product->getById($item['id']);

            if($values != null){ // which means it has product

                /*
                    Checks if the array already contains that ID
                    this avoids duplicated products
                */
                if(main::search_multidimensional($content, "id_product", $item['id_product']) == null){
                    $content[] = array("index" => $i, "quantity" => 1, $values);
                    $i++;
                }else{ /* 
                            in case it does have already the id_product in the array
                            I should update the "quantity" according to the "index".
                        */

                }
            }
        }
    }
}

return $content;

我的问题出在}else{之后。我一直在尝试一些代码而没有任何成功。我必须根据索引更新数量。虽然如果你们认为有更好的选择,请告诉我。

编辑:由于大多数人都担心search_multidimensional,这可能是我的解决方案,这里的功能如下:

public function search_multidimensional($array, $key, $value){
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value) {
            $results[] = $array;
        }

        foreach ($array as $subarray) {
            $results = array_merge($results, self::search_multidimensional($subarray, $key, $value));
        }
    }

    return $results;
}

3 个答案:

答案 0 :(得分:0)

编辑2:

在这种情况下,这会有帮助吗? (因为你的search_multidimensional只返回true或false)

$i = 0;
$content = array();

if(isset($_SESSION['cart'])){
    foreach($_SESSION['cart'] as $result){
        foreach($result as $item){
            $values = $product->getById($item['id']);

            if($values != null) { // which means it has product
                /*
                    Checks if the array already contains that ID
                    this avoids duplicated products
                */
                $product_exists = false;
                foreach($content as &$cItem) {
                    if($cItem['values']['id_product'] == $item['id_product']) {
                        $cItem['values']['quantity']++; // Increments the quantity by 1

                        $product_exists = true;
                        break;
                    }
                }
                // If the product does not exist in $content, add it in.
                if(!$product_exists)
                    $content[] = array("index" => $i, "quantity" => 1, "values" => $values);

                $i++;
            }
        }
    }
}

(再次编辑给$ value的数组键)


OLD ANSWER:

由于您要在$content中重新创建购物车数组,您可以在其他地方执行此操作:

$content[] = array("index" => $i, "quantity" => $result['quantity'] + 1, $values);

这样就会显示出来:

$i = 0;
$content = array();

if(isset($_SESSION['cart'])){
    foreach($_SESSION['cart'] as $result){
        foreach($result as $item){
            $values = $product->getById($item['id']);

            if($values != null){ // which means it has product
                /*
                    Checks if the array already contains that ID
                    this avoids duplicated products
                */
                if(main::search_multidimensional($content, "id_product", $item['id_product']) == null)
                    $content[] = array("index" => $i, "quantity" => 1, $values); 
                else
                    $content[] = array("index" => $i, "quantity" => $result['quantity'] + 1, $values); // Retrieve current quantity and adds 1

                $i++;
            }
        }
    }
}

(我假设你的数量只增加1)

答案 1 :(得分:0)

由于您的$content数组具有固定的结构(固定的级别数),因此您不需要使用递归函数。您的search_multidimensional功能可能会简单得多。它应该返回数组中找到的元素的索引(如果有的话):

function search_multidimensional($array, $key, $value) {
    foreach ($array as $i => $el) {
        foreach ($el as $j => $v) {
            if (is_int($j) && isset($v[$key]) && $v[$key] == $value) return $i;
        }
    }
    return false;
}

因此,应该像这样更改代码段构建$content

...
if (($index = search_multidimensional($content, "id_product", $item['id_product'])) === false) {
    $content[] = array("index" => $i, "quantity" => 1, $values); $i++;
}
else {
    $content[$index]['quantity']++;
}

答案 2 :(得分:0)

<强>解决即可。 我所要做的就是忘记$i变量,因为它实际上并没有做某些必要的。由于我有id_product,这是唯一的,我需要使用它。

if($values != null){ // Only if it has results

    // checks if array already contains or not the product ID

    // if does not have, it will add
    if(global_::search_multidimensional($content, "id_product", $item['id_product']) == null){
        $content[] = array("index" => $item['id_product'], "quantity" => 1, $values);
        // index is now the id of the product
    }else{

        // otherwise, loop all the elements and add +1
        foreach($content as $key => $result){
            if($item['id_product'] == $content[$key]['index']){ 
                $content[$key]['quantity']++;
            }
        }
    }
}