Вывод значений массива, только если он не пустой или нулевой

Я действительно новичок в php и не знаю, что мне нужно искать, чтобы решить эту проблему. Я пытаюсь показать только значения, если переменная не пуста и не равна нулю.

В массиве я назначаю:

$attributes [
    'glutenfree'     => getPublicClassificationsDescription($classifications, ARTICLE_GLUTENFREE),
    'lactosefree'    => getPublicClassificationsDescription($classifications, ARTICLE_LACTOSEFREE),
    'flavouringfree' => getPublicClassificationsDescription($classifications, ARTICLE_FLAVOURINGFREE),
    'corerange'      => getPublicClassificationsDescription($classifications, ARTICLE_CORERANGE),
    'engro'          => getPublicClassificationsDescription($classifications, ARTICLE_ENGRO),
    'vegan'          => getPublicClassificationsDescription($classifications, ARTICLE_VEGAN),
...
];

и еще много других атрибутов. Мне нужен вывод, что он печатается только в CSV, если он не пуст и не равен нулю.

Прямо сейчас я получаю такой результат:

glutenfree=,lactosefree=,flavouringfree=,corerange=,engro=,vegan=No,...

Вывод, который мне нужен, похож на то, что все, что пусто/нуль, должно исчезнуть, но те, у которых есть значение, должны быть там. В этом примере:

vegan=No,...

Например, если я попробую с «пустым» или «isset», это не сработает, и я получу пустую страницу без ошибок.

$glutenfree = getPublicClassificationsDescription($classifications, ARTICLE_GLUTENFREE);

$attributes [
    if (!empty($glutenfree)) {
        'glutenfree'     => $glutenfree,
        'lactosefree'    => getPublicClassificationsDescription($classifications, ARTICLE_LACTOSEFREE),
        'flavouringfree' => getPublicClassificationsDescription($classifications, ARTICLE_FLAVOURINGFREE),
        'corerange'      => getPublicClassificationsDescription($classifications, ARTICLE_CORERANGE),
        'engro'          => getPublicClassificationsDescription($classifications, ARTICLE_ENGRO),
        'vegan'          => getPublicClassificationsDescription($classifications, ARTICLE_VEGAN),
        ...
    }
];

person matt    schedule 31.01.2019    source источник


Ответы (2)


Вам нужно проверить, пуста ли переменная перед отправкой данных в массив, например:

#first, create an empty array
$attributes = array();
#get lactose value
$lactose_value = getPublicClassificationsDescription($classifications, ARTICLE_LACTOSEFREE);
#check if not empty string
if ($lactose_value !='') {
  #pushing to array
  $attributes['lactosefree'] = $lactose_value;
}

эту процедуру можно улучшить с помощью инструкции foreach.

$attributes = array()
#all fields now are inside an array
$fields = [ARTICLE_GLUTENFREE=>'glutenfree', ARTICLE_LACTOSEFREE=>'lactosefree',
          ARTICLE_FLAVOURINGFREE=>'flavouringfree', ARTICLE_CORERANGE=>'corerange' ,
          ARTICLE_ENGRO=>'engro', ARTICLE_VEGAN=>'vegan' ];
#iterating
$foreach($fields as $key=>$field) {
  #getting the value
  $arr_value = getPublicClassificationsDescription($classifications, $key);
  #check if not empty string
  if ($arr_value !='') {
    $attributes[$field] = $arr_value;
  }
}

Спасибо Dont Panic за ваш вклад. Спасибо micmackusa за доработку.

person danielarend    schedule 31.01.2019
comment
Я определенно согласен с тем, что второй бит был бы хорошим улучшением, но я думаю, что $fields нужно сопоставить те же строковые ключи в исходном $attributes, показанном в вопросе, с этими константами, такими как 'glutenfree' => ARTICLE_GLUTENFREE, и т. д. Мы действительно не знаем, какие значения констант держать. - person Don't Panic; 01.02.2019
comment
Хорошая идея, я улучшу этот ответ. - person danielarend; 01.02.2019
comment
благодарю вас. Кажется, это работает, но я все еще получаю некоторые пустые значения, такие как (без глютена =, без лактозы =,). Может быть, они не установлены (значит, они NULL?). Есть ли решение и для этого? - person matt; 01.02.2019
comment
@micmackusa спасибо за ваш вклад. Я добавил недостающие точки с запятой. Я не изменил !='', потому что в этом случае я хотел проверить пустую строку, а не пустую переменную. - person danielarend; 04.02.2019
comment
@matt, если вы var_dump($arr_value); увидите качество/длину обрабатываемого элемента. Я должен спросить вас прямо, возможно ли значение 0? Или они все Yes/No строки? Или что-то другое? - person mickmackusa; 04.02.2019

Самое простое решение (самое простое, как при минимальной модификации вашего существующего кода) состояло бы в том, чтобы просто сделать

$attributes = array_filter($attributes);

прежде чем преобразовать массив в строку.

person Don't Panic    schedule 31.01.2019
comment
... при условии, что у вас нет нулевых значений, которые вы хотите сохранить. array_filter() имеет склонность к жадности. stackoverflow.com/a/43657546/2943403 - person mickmackusa; 01.02.2019
comment
Я согласен с @micmackusa, это определенно правда, и я написал несколько ответов, прежде чем обращаться к этому, но в этом случае я думаю, что это выглядит маловероятным. - person Don't Panic; 01.02.2019
comment
У меня нет возможности проверить, что все допустимые значения будут Yes или No. - person mickmackusa; 01.02.2019