2014-11-17 2 views
1

Моя простая корзина покупок хранит идентификаторы продуктов в массиве сеансов.Проверка массива сеанса для значения (PHP in_array)

Я пытаюсь настроить оператор if/else, чтобы включить/отключить мою кнопку «Добавить в корзину» на основе идентификатора продукта в массиве или нет.

<?php 
session_start(); 

//Show cart array 

print_r($_SESSION['cart']); 
echo '<br><br>'; 

//Return "yes" or "no" 

$panier = $_SESSION['cart']; 
$produit = "5"; 

if (in_array($produit, $panier)) { 
print "yes man!"; 
} 
else { 
print "no man!"; 
} 

?> 

Я убедившись, что 5 является частью значения массива, отображая их этой тестовой странице, а вторая часть всегда возвращает «ни один человек!»

выглядит достаточно простым для меня. Что я делаю не так ?

print_r Вывод команды

5,5 

no man! 

это потому, что я добавил 2 "5" идентификатор продукта в моей корзине

Если изменить эту строку

print_r($_SESSION['cart']); 

для

print_r($_SESSION); 

Я получаю

Array ([cart] => 5,3,3,3,3,3,3,3,2) 

no man! 
+7

Показать вывод 'print_r ($ _ SESSION ['cart']);' –

+0

'print_r' не может выводить' 5,5', он должен выдавать результат, похожий на 'Array (cart => Array ([0] => 5 [1] => 5)) '. Однако, если это действительно дает '5,5', значит, вы помещаете его в строку, и поэтому' in_array' не работает. И, пожалуйста, не отправляйте обновления на свои вопросы в качестве ответов - скорее опубликуйте его как комментарий или обновите вопрос. –

ответ

3

Таким образом, в соответствии с вы, $_SESSION['cart'] = "5,5";, и это означает, что это строка. Таким образом, правильный код, чтобы посмотреть свою ценность является strpos():

$pos = strpos($produit, $_SESSION['cart']); 
if($pos !== false) { 
    echo "YES"; 
} 
else { 
    echo "NO"; 
} 

НО есть огромный риск, чтобы получить неправильный ответ на это. Представьте себе, что у вас есть два продукта в вашей корзине - сначала с идентификатором 15, а с другим с идентификатором 7. Вы будете искать идентификатор 5. Что бы вывел этот код? Он выдает «ДА».

Итак, вместо использования строки я предлагаю вам использовать многомерный массив (если вы хотите придерживаться сеансов). В данном конкретном случае, то переменная $_SESSION["cart"] будет массивом и с добавлением новых продуктов он будет выглядеть следующим образом:

$_SESSION["cart"] = array(); // initial value, don't call it every time or it'll flush your array 
$_SESSION["cart"][] = $product_ID; 

или сходный с ним.

print_r даст вам так же выглядящий вывод:

Array(
    cart => array(
     [0] => 5 
     [1] => 17 
     [2] => 5 
    ) 
) 

Затем in_array должен работать. Но планируйте свое хранение с умом;)

+0

Спасибо за ваш быстрый ответ. Согласно сценарию, который возвращается после моих изменений, я думаю, что у меня действительно есть массив. Нет ли другого способа проверить мою ценность в нем, которая не потребует от меня изменить способ записи $ _SESSION? Это было бы болью! –

+0

@ FélixDesmeules, вы ошибаетесь, в соответствии с вашим результатом вы получили строку в '$ _SESSION ['cart']', а не массив. Более простой способ? Ну, всегда есть способ, и вы можете хранить переменные, как хотите. Но со временем, когда ваш код становится все больше, вы __will__ пришли к выводу, что это неправильный путь, поверьте мне. Поэтому лучше переписать его сейчас, чем позже;) –

+0

Тогда моя проблема в том, что в настоящее время все работает со строками, хотя я уверен, что вы правы в части перезаписи, мне придется идти этим путем пока. могу ли я изменить строку на массив в этом коде? –

0

Как спросил джон это лучше всегда ставить вывод вашей программы Но сейчас я заподозрить проблему находится в in_array проверить эту ссылку A problem about in_array это может помочь

+1

Ваше сообщение не отвечает на вопрос полностью, поэтому в будущем, пожалуйста, не публикуйте его как ответ, а как комментарий по вопросу. –

+0

Получил это, следующие ответы.Спасибо – user3278897

+0

@Nordenheim У них нет представителя, чтобы оставить комментарий. – EternalHour

Смежные вопросы