Удалить элемент из массива, если не найден - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть некоторый код, который я создал, который должен увидеть, существует ли что-то в массиве строк.Если он не существует, я хочу удалить этот элемент массива.Я думал, что мы делаем это с unset, но, похоже, это не работает.Помогать умом?

echo '<br>size of $games before end-check: '.sizeof($games);
foreach ($games as $game) {
    $game_end_marker = "body = (game)#";
    $game_end_pos = strpos($game, $game_end_marker);
    if ($game_end_pos !== false) {
        echo "<br>end of game found";
    } 
    else {
        echo "<br>end of game not found. incomplete game";
        unset($game);
    }
}
echo '<br>size of $games after end-check: '.sizeof($games);

вывод:

size of $games before end-check: 2  
end of game found  
end of game not found. incomplete game  
size of $games after end-check: 2  

Ответы [ 6 ]

4 голосов
/ 21 декабря 2011

Поскольку вы сбрасываете переменную $ game, а не элемент в массиве. Попробуйте это:

echo '<br>size of $games before end-check: '.sizeof($games);
foreach ($games as $index => $game) {
    $game_end_marker = "body = (game)#";
    $game_end_pos = strpos($game, $game_end_marker);
    if ($game_end_pos !== false) {
        echo "<br>end of game found";
    } 
    else {
        echo "<br>end of game not found. incomplete game";
        unset($games[$index]);
    }
}
echo '<br>size of $games after end-check: '.sizeof($games);
2 голосов
/ 21 декабря 2011

Это просто отменяет вашу локальную ссылку на элемент.Вы должны обращаться непосредственно к массиву.

foreach($games as $key => $game)
    unset($games[$key]);
2 голосов
/ 21 декабря 2011

Вы должны сбросить индекс игры.

foreach ($games as $key => $value) {
  // all your logic here, performed on $value
  unset($games[$key]);
}
0 голосов
/ 21 декабря 2011

Вы можете использовать array_splice в сочетании с постепенно увеличивающейся индексной переменной, чтобы удалить текущий элемент из массива:

$index = 0;
foreach ($games as $game) {
    $game_end_marker = "body = (game)#";
    $game_end_pos = strpos($game, $game_end_marker);
    if ($game_end_pos !== false) {
        echo "<br>end of game found";
    } 
    else {
        echo "<br>end of game not found. incomplete game";
        array_splice($games, $index, 1);
    }
$index++;
}
0 голосов
/ 21 декабря 2011

Вы также можете позвонить по ссылке:

foreach($games as &$game) {
    unset($game);
}

Таким образом, вы также можете изменить $game (например, $game .= " blah";), и исходный массив будет изменен.

0 голосов
/ 21 декабря 2011

Это не сработает: foreach создает новую переменную, копируя старую.Отмена установки не повлияет на исходное значение.Аналогично, создание ссылки не будет работать, так как будет удалена только ссылка.

Самый хороший способ сделать это - array_filter:

$games = array_filter($games, function($game) {
    $game_end_marker = "body = (game)#";
    $game_end_pos = strpos($game, $game_end_marker);

    if ($game_end_pos !== false) {
        echo "<br>end of game found";
        return true;
    } 
    else {
        echo "<br>end of game not found. incomplete game";
        return false;
    }
});

При этом используется синтаксис анонимной функции, введенный в PHP 5.3.Если функция возвращает true, элемент сохраняется;если возвращается false, элемент удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...