Как проверить массив на несколько значений? - PullRequest
1 голос
/ 01 января 2012

У меня есть переменная, которую я вытащил из таблицы базы данных следующим образом:

while($r = mysql_fetch_array($query) //The query is just: SELECT * FROM stuff_table WHERE userid='$userid'
{ 
$stuff = $r['stuff'];
}

Переменная вещи выглядит так: «автомобили, книги, компьютеры, продукты питания», и я сделал ее массивом:

//I used:
$array_of_stuff = explode(",", $stuff); //This gave me an array.

Теперь я хотел проверить его значения, например:

if(in_array("cars", $array_of_stuff) && in_array("books", $array_of_stuff))
{ 

//This line is the problem, I want it to check to see if it has "cars" and "books" in the array but this code is not working for that like it should. Instead of checking and finding both, it just goes on to the next elseif. 

echo "Cars and Books";
} elseif(in_array("cars")) {
//
echo "Only cars";
} elseif(in_array("books")) {
echo "Only books";
} else {
echo "Other stuff...";
}

Вывод, который я получаю из этого: «Только автомобили» вместо «Автомобили и книги».

Итак, как я могу заставить свой код проверять массив на наличие 2 или более значений, прежде чем продолжить его оператор if / elseif?Возможно ли это с помощью функции in_array?

Var Dump:

array(4) { [0]=> string(4) "cars" [1]=> string(6) " books" [2]=> string(10) " computers" [3]=> string(6) " foods" }

Ответы [ 3 ]

1 голос
/ 01 января 2012

Если $ array_of_stuff фактически установлен на explode(",","cars, books, computers, foods"), как вы описали, тогда массив будет иметь начальные пробелы перед значениями, отличными от автомобилей. Функция in_array() не соответствует подстрокам целевых элементов, поэтому «книги» не будут сопоставляться с «книгами» в массиве.

Если вам нужно разобрать строку, подобную этой, вам необходимо убедиться, что у вас есть точное определение формата, в котором она находится, чтобы вы могли правильно проанализировать ее в массив. Если «,» является единственным разделителем, и эта последовательность всегда представляет разделитель (например, он никогда не экранируется и не заключается в кавычки), тогда вы можете изменить explode(",",...) на explode(", ",...). Если это данные, которые вы храните, помните, что вы не должны изобретать свой собственный формат. Вместо этого используйте что-то вроде serialize() (который понимает только PHP) или json_encode() (который легко переносим) для преобразования нативных типов в строку (и соответствующие функции декодирования для его декодирования).

Кроме того, сохранение массива в поле строки таблицы SQL часто, но не всегда, признак того, что схема неверна.

0 голосов
/ 02 мая 2018

Чтобы скопировать все значения массива в переменные, используйте конструкцию list ():

list($variable, ...) = $array;

Значения массива копируются в перечисленные переменные во внутреннем порядке массива.По умолчанию это порядок, в котором они были вставлены, но функции сортировки, описанные ниже, позволяют вам это изменить.Вот пример:

$person = array('name' => 'Mizan', 'age' => 26, 'wife' => 'Mita');
list($name, $age, $wife) = $person;
0 голосов
/ 01 января 2012

Да, вы можете проверить 2 или более игл с помощью in_array(), передав их в первом аргументе в виде массива:

$searchStuff = array('cars','books');
if(in_array($searchStuff, $array_of_stuff)){
    // both found
}

См. php.net , пример # 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...