Как мне собрать ключи всех истинных значений в массиве? - PullRequest
0 голосов
/ 19 октября 2010

Это слегка измененная версия кода в документации PHP:

http://php.net/manual/en/function.next.php

<?php

$array = array(
    -1 => true,
    0 => false,
    1 => true
);

while ($bet = current($array)) {
    if ($bet == true) {
        echo key($array) . '<br />';
    }
    next($array);
}
?>

Это настолько близко, насколько я мог бы получить к тому, что я хотел.

Это повторяет «-1», и я действительно понимаю, почему.

Я хочу знать, как изменить этот код так, чтобы он продолжал поиск «истинных» значений, даже после того, как встретитfalse (и не только для массива из 3 значений).

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

Заранее спасибо !!

Труфа

Ответы [ 5 ]

4 голосов
/ 19 октября 2010
echo join("<br>", array_keys(array_filter($array)));

array_filter возвращает истинные значения, когда вы не предоставляете метод обратного вызова, array_keys возвращает ключи для этих значений, а затем подготавливает его к выводу, используя join

1 голос
/ 19 октября 2010

Вы можете использовать комбинацию array_filter и array_keys:

$array = array(
  -1 => true,
  0 => false,
  1 => true
);

$keys = array_keys(array_filter($array));
echo join("<br />", $keys);

См. Это в действии на http://www.ideone.com/AREmK.

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

Если обратный вызов не предоставлен, все записи ввода, равные FALSE (см. Преобразование в логическое значение), будут удалены.

Обратите внимание, что это также отфильтровывает значения, которые ложно . Если вы хотите фильтровать только те значения, которые явно false:

function filter_false($val)
{
  return $val !== false; // if $val is not false, it'll be kept
}
$keys = array_keys(array_filter($array, 'filter_false'));
1 голос
/ 19 октября 2010

Вы можете перебрать весь массив:

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

edit: no? .. хм .. другой метод:

while (list($key,$value) = each($bet)) { 
  if ($value) echo $key . "<BR/>";
}
0 голосов
/ 19 октября 2010
foreach ($array as $key => $value) { 
  if ($value == true) echo $key . "<br/>"; 
} 
0 голосов
/ 19 октября 2010

Конструкция while($bet = current($array)) будет продолжать цикл только до тех пор, пока текущий элемент массива оценивается как true.Как правило, циклы while подразумевают, что вы выполняете цикл до тех пор, пока не будет выполнено какое-либо условие.

Если вы хотите выполнить действие с каждым элементом массива, вам следует использовать цикл for или foreach, в котором более четко указано ваше намерение выполнить итерацию по всему массиву:

for($i = 0; $i < count($array); ++$i) {

}

foreach ($array as $key => $value) {

}
...