PHP: Удалить неверное значение массива? - PullRequest
1 голос
/ 30 апреля 2011

Я использую два массива, один представляет собой строку POST (product), а другой - предопределенный набор значений (products).

Они работают вместе как

$products[$_POST['product']]  

Это нормально, если значение POST точно одно из следующих:

 $products = array(      
     'Pineaple' => 500, 'Banana' => 50, 'Mango' => 150,       
     'Milk' => 500, 'Coffe' => 1200, 'Butter' => 300,      
     'Bread' => 450, 'Juice' => 780, 'Peanuts' => 800,      
     'Yogurt' => 450, 'Beer' => 550, 'Wine' => 2500,    
 );    

В противном случае будут появляться сообщения неопределенного индекса.Поскольку это СЕССИЯ, мне нужно как-то сохранить список элементов, но удалить из массива недопустимые элементы и вывести сообщение.

Пожалуйста, проверьте скриншот: http://img36.imageshack.us/img36/9121/20110430004019.jpg

Это скрипт, который я использую:

<?php
session_start();

//Getting the list
 $_SESSION['list'] = isset($_SESSION['list']) ? $_SESSION['list'] : array();    

 //stock    
 $products = array(      
     'Pineaple' => 500, 'Banana' => 50, 'Mango' => 150,       
     'Milk' => 500, 'Coffe' => 1200, 'Butter' => 300,      
     'Bread' => 450, 'Juice' => 780, 'Peanuts' => 800,      
     'Yogurt' => 450, 'Beer' => 550, 'Wine' => 2500,    
 );    

 //Saving the stuff    
 $new_item = array(      
     'item' => $_POST['product'],       
     'quantity' => $_POST['quantity'],     
     'code' => $_POST['code'],      
     'price' => $products[$_POST['product']] * $_POST['quantity'],    

 );

$new_product = true;    
foreach($_SESSION['list'] as $key => $item) {      
    if ($item['item'] == $new_item['item']) {        
    $_SESSION['list'][$key]['quantity'] += $new_item['quantity'];        
    $_SESSION['list'][$key]['price'] = 
            $products[$new_item['item']] * $new_item['quantity'];        
    $new_product = false;
    }    
}   

if ($new_product) {      
    $_SESSION['list'][] = $new_item;        
}    

//listing    
echo  "<b>SHOPPING LIST</b></br>";    
foreach($_SESSION['list'] as $key => $item) {       
    echo 'Product .'. $key. ' '. $item['item'], ' ', 
          $item['quantity'], ' units: ', $item['price']. '<br />';    
}

echo "</br> <a href='index.html'>Return to index</a> </br>";

//Printing session
var_dump($_SESSION);

//session_destroy();
?>

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

Вы должны использовать isset или array_key_exists, чтобы проверить, существует ли ключ перед его чтением:

if (isset($products[$_POST['product']])) {
    // product in stock
} else {
    // product not in stock
}

И если вы используете тот жевведите список продуктов в $_SESSION['list'], вам не нужно будет повторять весь список, чтобы найти тот же продукт в списке:

if (isset($_SESSION['list'][$_POST['product']])) {
    // update product in list
    $_SESSION['list'][$_POST['product']]['quantity'] += $_POST['quantity'];
    $_SESSION['list'][$_POST['product']]['price'] = $products[$_POST['product']] * $_POST['quantity'];
} else {
    // add product to list
    $_SESSION['list'][$_POST['product']] = array(
        'item'     => $_POST['product'],
        'quantity' => $_POST['quantity'],
        'code'     => $_POST['code'],
        'price'    => $products[$_POST['product']] * $_POST['quantity'],
    );
}

Обратите внимание, что это всегда будет только добавлять элементы в список.Вы должны добавить некоторые функции, чтобы также обновлять и удалять элементы.И не забудьте проверить данные перед их использованием (например, чтобы люди не получали возмещение, если они вводят отрицательное количество).

0 голосов
/ 30 апреля 2011

Я думаю, вы хотите использовать функцию array_intersect_assoc .он возвращает элементы, которые находятся в обоих ваших массивах.

...