Count () возвращает 1 с разделенной запятыми строкой с разнесением - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть поле для хранения тегов через запятую. Я пытаюсь посчитать количество предметов в списке.

Допустим, я уже извлек данные из БД, а переменная $ tags содержит следующую информацию:

$tags = "Videos,Magazines,Store";

// First separate tags by commas, put into into array
$tagArray = explode(",",$tags);

// Count how many items are in the array
$arrayCount = count($tagArray);

Это всегда возвращает «1», независимо от того, есть ли элемент в массиве или нет. переменная $ tags может содержать любое количество элементов - от пустого до одного элемента, например «Видео», до нескольких элементов «Видео, Игры, Магазин» и т. д.

Может кто-нибудь помочь мне с тем, что я делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2014

Из руководства по PHP:

Если разделитель содержит значение, которое не содержится в строке, и используется отрицательный предел, то будет возвращен пустой массив, в противном случае будет возвращен массив, содержащий строку..

Итак, просто - если разделитель не найден в строке, разнесение ничего не делает. Если ваша переменная содержит пустую строку, count () вернет 1. нужно значение NULL для count () для возврата 0.

Попробуйте это:

    $tags = "Videos,Magazines,Store";

    // First separate tags by commas, put into into array<br>
    $tagArray = <b>($tags != '')?</b>explode(",",$tags)<b>:NULL</b>;

    // Count how many items are in the array<br>
    $arrayCount = count($tagArray);
0 голосов
/ 25 октября 2018

Ваш код работает нормально, он возвращает 3, как и ожидалось, потому что вы предоставили правильный ввод строку для работы кода, но проблема возникает, когда вы присваиваете значение поля базы данных для $tags, поскольку он также может содержать пустую строку , как вы сказали в своем вопросе.

так как вы сказали, что это может быть ноль или больше нуля тегов в поле дБ, поэтому, когда $tags не содержит тегов или пустую строку, тогда как php explode () руководство функции говорит:

Если разделитель содержит значение, которое не содержится в строке, будет возвращен массив , содержащий строку типа [""] .

Итак, когда ваш $tags содержит пустую строку , тогда explode() возвращает массив , содержащий пустую строку , так что теперь ваш $tagArray=[""], после взрыва вы используете функцию count() , так же как php руководство count () It

Возвращает количество элементов в array_or_countable. Если параметр не является ни массивом, ни объектом с реализованным интерфейсом Countable, будет возвращено 1 . Есть одно исключение: если array_or_countable равен NULL, будет возвращено 0 .

, потому что ваш $tagArray равен не NULL, а $tagArray=[""], поэтому count($tagArray) возвращает единицу.

Так что для ее решения используйте код ниже:

$tags = "Videos,Magazines,Store";
// it can also contains empty string like $tags = ""
$arrayCount = ($tags)?count(explode(",",$tags)):0;
//here $arrayCount will have 3 as expected, But if your $tags contains empty string it will return 0 instead of 1.
...