Использование if(! Empty) с несколькими переменными вне массива
Я пытаюсь отшлифовать некоторый код с помощью if(!empty)
функция в PHP, но я не знаю, как применить это к нескольким переменным, когда они не являются массивом (как я должен был сделать ранее), поэтому, если у меня есть:
$vFoo = $item[1];
$vSomeValue = $item[2];
$vAnother = $item[3];
Тогда я хочу напечатать результат, только если есть значение. Это работает для одной переменной, поэтому у вас есть:
if (!empty($vFoo)) {
$result .= "<li>$vFoo</li>";
}
Я попробовал что-то вроде
if(!empty($vFoo,$vSomeValue,$vAnother) {
$result .= "<li>$vFoo</li>"
$result .= "<li>$vSomeValue</li>"
$result .= "<li>$vAnother</li>"
}
Но, конечно, это не работает.
15 ответов
Вы можете создать новую функцию-оболочку, которая принимает несколько аргументов и передает каждый из них через empty(). Он будет работать аналогично isset(), возвращая true только если все аргументы пусты, и возвращая false, когда он достигает первого непустого аргумента. Вот то, что я придумал, и это сработало в моих тестах.
function mempty()
{
foreach(func_get_args() as $arg)
if(empty($arg))
continue;
else
return false;
return true;
}
Примечание: "m" в начале слова "mempty" обозначает "множественный". Вы можете называть это как хотите, но это казалось самым коротким / простым способом назвать это. Кроме того... это интересно сказать.:)
Обновление 10/10/13: я, вероятно, должен добавить, что в отличие от empty () или isset(), эта функция mempty() будет плакать кровавым убийством, если вы передадите ей неопределенную переменную или несуществующий индекс массива.
Вам нужно написать цепочку условий. использование &&
проверить несколько переменных, каждая из которых имеет свои empty()
тестовое задание:
if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {
Но вы, вероятно, хотите разделить его на три if, чтобы вы могли применить дополнительный текст по отдельности:
if (!empty($vFoo)) {
$result .= "<li>$vFoo</li>";
}
if (!empty($vSomeValue)) {
$result .= "<li>$vSomeValue</li>";
}
if (!empty($vAnother)) {
empty()
может принять только один аргумент. isset()
с другой стороны, может принимать несколько; он вернет истину тогда и только тогда, когда установлены все аргументы. Однако это проверяет только, установлены ли они, а не пустые, поэтому, если вам нужно специально исключить пустые строки, вам придется делать то, что предлагает kelloti.
Используйте логические / логические операторы:
if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {
$result .= "<li>$vFoo</li>"
...
}
Кроме того, вы можете присоединиться к ним с or
вместо and
, Как видите, это может дать вам немного гибкости.
Просто добавляю в пост imkingdavid;
Возвращать TRUE
если какой-либо из параметров является пустым, проверьте ниже.
function mempty(...$arguments)
{
foreach($arguments as $argument) {
if(empty($argument)) {
return true;
}
}
return false;
}
Это ближе к тому, как isset()
работает, и как я ожидал empty()
работать, если поддерживает переменную длину параметров. Это также будет соответствовать тому, как empty()
работает в том, что он вернется FALSE
если все не пусто.
Если указано несколько параметров, то isset() вернет TRUE, только если все параметры установлены. Оценка идет слева направо и останавливается, как только встречается неустановленная переменная.
Я использую эту функцию как альтернативу isset. Это немного проще, чем у @imkingdavid, и возвращает true, если все аргументы (переменные) не пусты или возвращают false после первого пустого значения.
function isNotEmpty() {
foreach (func_get_args() as $val) {
if (empty($val)) {
return false;
}
}
return true;
}
Сэкономьте себе набор текста и поместите его в цикл...
foreach (array('vFoo','vSomeValue','vAnother') as $varname) {
if (!empty($$varname)) $result .= '<li>'.$$varname.'</li>';
}
Как отмечали другие, empty()
принимает только один аргумент, поэтому вы должны использовать что-то вроде
if(!empty($v1) && !(empty($v2) ...)
но if (!empty($v))
это то же самое, что if($v)
так что вы также можете использовать:
if ($v1 && $v2 ...)
Почему бы просто не перебрать массив $item
foreach($item as $v) {
if(!empty($v))) {
$result .= "<li>$v</li>";
}
}
Вы также можете проверить значение индекса ключа
foreach($item as $key => $value) {
if($key == 'vFoo') {
if(!empty($value))) {
$result .= "<li>$value</li>";
}
}
// would add other keys to check here
}
Для пустых () и isset()
$zero = array(0, "0");
foreach($zero as $z) {
echo "\nempty(): $z ";
var_dump($z);
var_dump(empty($z)); // Will return true as in it's empty
echo "isset(): $z ";
var_dump(isset($z)); // will return true as it has value
}
Выход:
empty(): 0 int(0)
bool(true)
isset(): 0 bool(true)
empty(): 0 string(1) "0"
bool(true)
isset(): 0 bool(true)
Почему бы просто не так:
foreach(array_filter($input_array) as $key => $value) {
// do something with $key and $value
}
Ребята, большое спасибо за все ваши ответы, я вроде создал сценарий, основанный на всех наших возможных ответах, который на самом деле помогает мне в изучении синтаксиса PHP, который является причиной большинства моих ошибок:)
$vNArray ['Brandon'] = $item[3];
$vNArray['Smith']= $item[4];
$vNArray ['Johnson']= $item[5];
$vNArray ['Murphy']= $item[6];
$vNArray ['Lepsky']= $item[7];
foreach ($vNArray as $key => $value){
if(!empty($value)){
$result .= "\t\t\t\t<li><strong>$key</strong>" .$value. "</li>\n";
}
Мне просто нужно выяснить, как сделать некоторые из них по-другому. Так могу ли я получить доступ к каждому из них следующим образом?
$result .= "\t\t\t\t<li><strong>$key[0]</strong>" .$value. "</li>\n";
$result .= "\t\t\t\t<li><a href="thislink.com">$key[3]</a>" .$value. "</li>\n";
Спасибо, парни!
Просто для записи: array_reduce также работает.
if (!array_reduce($item, function($prev_result,$next) {
return $prev_result || empty($next); // $prev_result will be initial null=false
})) {
// do your stuff
}
Я не уверен на 100%, что понимаю, что вы пытаетесь сделать, но вот несколько возможных ответов:
Это вернет каждую переменную, только если она не пуста:
function printIfNotEmpty($var) {
if (!empty($var)) {
return '<li>' . $var . '</var>';
}
return '';
}
$result .= printIfNotEmpty($vFoo);
$result .= printIfNotEmpty($vSomeValue);
$result .= printIfNotEmpty($vAnother);
Или этот добавит все три из них, если ни один из них не пуст:
if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {
$result .= '<li>' . $vFoo . '</li>';
$result .= '<li>' . $vSomeValue . '</li>';
$result .= '<li>' . $vAnother . '</li>';
}
можно попробовать пхп
&&
/
and
оператор. Они оба одинаковы.
if(!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother) {
$result .= "<li>$vFoo</li>"
$result .= "<li>$vSomeValue</li>"
$result .= "<li>$vAnother</li>"
}
Если вы работаете только со строками, вы можете попробовать следующее:
if(empty($str1.$str2.$str3)){ /* ... */ }
Обратите внимание, что empty(0) будет возвращать true, тогда как empty('0'.'0') и empty('0') не будут.