2011-07-15 3 views
1

У меня вопрос о массивах и foreach.PHP Array foreach вопрос

Если у меня есть массив как это:

$test_arr = array(); 
$test_arr['name1'] = "an example sentence"; 
$test_arr['anything'] = "dsfasfasgsdfg"; 
$test_arr['code'] = "4334refwewe"; 
$test_arr['empty1'] = ""; 
$test_arr['3242'] = ""; 

, как я могу сделать Еогеасп и «выбрать» только те, которые имеют значения? (в моем примере массива будут принимать только первые 3, имя1, что угодно и код).

Я попытался с

foreach ($test_arr as $test) { 
    if (strlen($test >= 1)) { 
    echo $test . "<br>"; 
    } 
} 

, но он не работает. Без условия «if» это работает, но значения пустых массивов учитываются, и я не хочу этого (потому что мне нужно сделать <br> после каждого значения, и я не хочу <br>, если нет значения)

Извините, если я не очень хорошо себя объясню, надеюсь, вы понимаете мою мысль. Не должно быть слишком сложно, я думаю ..

Спасибо за помощь!

+0

Спасибо всем! – Matt

ответ

4

Может работать

foreach ($test_arr as $test) { 
    if (strlen($test)!=="") { 
    echo $test . "<br>"; 
    } 
} 

Ваше решение с исправленным синтаксисом:

foreach ($test_arr as $test) { 
    if (strlen($test)>=1) { 
    echo $test . "<br>"; 
    } 
} 
+0

Отредактировано снова, первая версия сейчас; Вторая версия не будет работать с $ test = 0 (integer) – RiaD

1

Так это выглядит, как вы используете ассоциативный массив, вы должны быть в состоянии сделать это:

foreach($test_arr as $key => $value) 
{ 
    if($value != "") 
    { 
     echo $value . "<br />"; 
    } 
} 

Как показано, вы можете проверить $value на пустую строку напрямую. Поскольку это именно те тесты, которые вы пытаетесь выполнить, я надеюсь, что это решит вашу проблему отлично.

На другом примечании это довольно прямолинейно и должно быть очень удобно в будущем, когда вы забыли, что именно вы делали!

+0

@ RIAD извините? Это на самом деле отличный ответ и более удобный, чем многие другие. Фактически, это явно делает тест на «непустую строку», чего хочет OP, а не просто на длину 0. Небольшой каламбур, да, и они оба выполняют одно и то же, но это неважно. – rockerest

+0

read previos version – RiaD

+0

Не уверен, что вы имеете в виду. Вы любезно удалите свой -1 или объясните, как этот пост является вредным? Я принимаю downvotes за то, что в чем-то принципиально неправильно, но я обижаюсь на это. – rockerest

0

Вы можете проверить, находится ли значение emtpy с помощью empty().

Обратите внимание, что такие значения, как 0 или false, также считаются empty, поэтому вам, возможно, придется проверять длину строки.

0

только простая опечатка:

foreach ($test_arr as $test) { 
    if (strlen($test) >= 1) { 
    echo $test . "<br>"; 
    } 
} 
0

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

 foreach ($test_arr as $test) { 
      if (strlen($test) > 0) { 
      echo $test . "<br>"; 
      } 
    } 
1

Поскольку пустые строки являются ложными, вы могли бы просто сделать это (но вы бы исключить 0 с КРП):

foreach ($test_arr as $key => $val) { 
    if ($val) { 
    echo $val. "<br>"; 
    } 
} 

Если она должна быть пустая строка, то (за исключением 0 и FALSE):

foreach ($test_arr as $key => $val) { 
    // the extra = means that this will only return true for strings. 
    if ($val !== '') { 
    echo $val. "<br>"; 
    } 
} 
1

Вы лучше использовать время цикла, как это:

while(list($test_key, $test_value) = each($test_arr)) 
{ 
    if($test_value != "") { echo $test_value . "<br/>"; } 
} 
reset($test_arr); 

Если ваш массив становится большим, в то время как будет намного быстрее. Даже на небольших массивах я заметил большую разницу во времени выполнения.

И если вам действительно не нужен ключ массива. Вы можете просто сделать это:

while(list(, $test_value) = each($test_arr)) 
{ 
    if($test_value != "") { echo $test_value . "<br/>"; } 
} 
reset($test_arr);