Joshc
Joshc

Reputation: 3853

How to avoid undefined variable in php when variable does not exist?

I only touch php on the very basic stuff.

But I always like to avoid errors/notices when making wordpress themes.

I have a simple function below that I made to list my taxonomy terms.

$tax = 'dealer-communications';
$terms = get_terms($tax);
$count = count($terms);
if ( $count > 0 ){
    echo '<li class="nav-header">Dealer communications</li>';
    foreach ( $terms as $term ) {
        if (get_queried_object()->slug == $term->slug) $active = 'class="active"';
        echo '<li '.$active.'><a href="'.get_term_link($term->slug, $tax).'">' . $term->name . '</a></li>';
    }
}


As you can see I have a $active variable.

This active variable is undefined when the my get_queried_object()->slug does not match $term->slug

How can I avoid my active variable from being undefined. So it is defined but empty.

They only way my brain could work it out is by doing this...

$active = null;
if (get_queried_object()->slug == $term->slug) $active = 'class="active"';

or...

if (get_queried_object()->slug == $term->slug) {
    $active = 'class="active"';
} else {
    $active = '';
}


Is this the most efficient way of doing this or is there an alternative php method?


Many Thanks Josh

Upvotes: 0

Views: 3599

Answers (5)

cernunnos
cernunnos

Reputation: 2806

The second option is the best approach as it makes sure the variable value actually changes on every loop, otherwise there is a possibility that the value of the previous loop will affect the current one.

For example, you get to an active LI, set $active to the correct value and all works ok. However, on next loop step the LI should not be active, but because you are not clearing the previous assignment the $active variable will still set this LI to active.

EDIT: PHP scope does not work like javascript scope, some coments on this answer seem to require this clarification:

$test = array(
  array("name"=>"Is inactive", "active"=>false),
  array("name"=>"Is active", "active"=>true),
  array("name"=>"Is caught by problem", "active"=>false)
);

foreach ($test as $example ){
  if ($example["active"]) $active = true;

  if ($active) {
    echo $example["name"]." was parsed as ACTIVE\n";
  } else {
    echo $example["name"]." was parsed as INACTIVE\n";
  }
}

Outputs a notice (because $active is undefined on the first step of the loop) and the following text:

Is inactive was parsed as INACTIVE
Is active was parsed as ACTIVE
Is caught by problem was parsed as ACTIVE <--- Problem

Upvotes: -1

soju
soju

Reputation: 25312

There is no alternative php method, but for readability you should not declare/init your variables in a if block, e.g. :

foreach ( $terms as $term ) {
    $active = '';
    if (get_queried_object()->slug == $term->slug) $active = 'class="active"';
    echo '<li '.$active.'><a href="'.get_term_link($term->slug, $tax).'">' . $term->name . '</a></li>';
}

You can also use ternary operator (but not really readable) :

$active = (get_queried_object()->slug == $term->slug) ? 'class="active"' : '';

Upvotes: 2

insertusernamehere
insertusernamehere

Reputation: 23600

You could also use the ternary operator as it's a bit shorter:

$active = ( get_queried_object()->slug == $term->slug ? 'class="active"' : '' );

Upvotes: 1

juco
juco

Reputation: 6342

The second approach is more common to see in my experience. You could of course shorten this using a ternary operator, similar to:

$active = (get_queried_object()->slug == $term->slug) ? 'class="active"' : '';
//       if ^                                            ^ do this        ^ else do this    

Some consider this to be more confusing though. I guess that boils down to personal preference.

Upvotes: 1

Dead Man
Dead Man

Reputation: 2941

The 2nd one will be the more efficient way :

if (get_queried_object()->slug == $term->slug) {
    $active = 'class="active"';
} else {
    $active = '';
}

Upvotes: 1

Related Questions