За цикл, требующий больше повторений, чем нужно для результата, который мне нужен - PullRequest
1 голос
/ 07 июля 2011

У меня проблема. На мой взгляд, это должно работать нормально:

for($i = 0; $i < count($tags); $i++){
        if(in_array($tags[$i], $str)){
            for($a = 0; $a < count($str); $a++){
                if($tags[$i] == $str[$a]){
                    unset($str[$a]);
                }
            }
        }
    }

str - массив, состоящий из 1, 3, 4, 5, 500, 501.

tags - это массив, состоящий из 4, 5, 500, 501.

Результат должен быть 1, 3. Результат - 1, 3, 500, 501.

После экспериментов я обнаружил, что этот код работает, но нестабилен, на мой взгляд:

for($i = 0; $i < count($str) + count($tags); $i++){
        for($a = 0; $a < count($tags); $a++){
            if ($tags[$a] == $str[$i]) {
                unset($str[$i]);
            }
        }
        $a = 0;
    }

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Слишком много кода, когда вы можете просто сделать:

$difference = array_diff($tags, $str);
1 голос
/ 07 июля 2011

Предполагая, что вы не используете array_diff.

  1. Если у вас нет чрезвычайно веских причин, foreach просто лучше.Вам не нужно считать, и вы имеете дело с реальными ключами массива.
  2. Встроенные функции массива - ваши друзья.array_search намного лучше в итерации, чем самый оптимизированный код PHP.
  3. Хотя циклы могут сделать вашу жизнь лучше: -)

Пример:

foreach( $tags as $tag )
{
    while( ( $key = array_search( $tag, $str ) ) !== FALSE )
    {
        unset( $str[ $key ] );
    }
}
...