Как удалить повторяющиеся значения из массива в цикле foreach?

#php #arrays #foreach #duplicates #array-unique

#php #массивы #foreach #дубликаты #массив-уникальный

Вопрос:

Я хочу удалить повторяющиеся значения из массива. Я знаю, как использовать array_unique(array) функцию, но столкнулся с проблемой в foreach цикле. Это не повторяющийся вопрос, потому что я прочитал несколько вопросов по этому поводу, и большинство из них вынуждают использовать array_unique(array) функцию, но я понятия не имею, как использовать ее в foreach цикле. Вот моя функция php.

 $images = scandir($dir);
$listImages=array();
foreach($images as $image){
    $listImages=$image;
    echo substr($listImages, 0, -25) ."<br>"; //remove last 25 chracters
}
 

Как это сделать?

Комментарии:

1. можете ли вы опубликовать ожидаемые выходные и входные данные

2. пожалуйста, укажите свой полный пример

3. да, вы можете использовать array_unique после завершения цикла foreach.

4. Use array_unique() ?? что-то вроде array_unique($images)

5. Ваш код не имеет ничего общего с тем, что вы говорите. Если вы хотите удалить дубликаты из массива альтернативным способом, пожалуйста, используйте классический шаблон двойной итерации

Ответ №1:

Очень сложно удалить повторяющиеся значения из массива в цикле foreach. Просто вы можете поместить все элементы в один массив, а затем удалить дубликаты, а затем получить нужные вам значения. Попробуйте следующий код.

    $listImages=array();
   $images = scandir($dir);

   foreach($images as $image){
       $editedImage = substr($image, 0, -25);
       array_push($listImages, $editedImage);
   } 

   $filteredList = array_unique($listImages);

   foreach($filteredList as $oneitem){
       echo $oneitem;
   }
 

Ответ №2:

Приведенный вами пример может быть изменен следующим образом:

 $images = scandir($dir);
$listImages=array();
foreach($images as $image) {
    if (!in_array($image, $listImages)) {
        $listImages[] = $image;
    }
    echo substr($image, 0, -25) ."<br>"; //remove last 25 chracters
}
 

Теперь $listImages не будет содержать дубликатов, и он будет повторять каждое изображение (включая дубликаты).

Комментарии:

1. @ mister martin, он будет оптимизирован, если будет использоваться array_unique($listImages) после завершения цикла. на данный момент вы проверяли каждый раз в цикле.

2. зачем голосовать против… если ответ правильный и отличается от вашего @mister martin

3. Я хочу напечатать каждое значение в цикле foreach. Так что не могу использовать array_unique($listImages) после завершения цикла

Ответ №3:

На основе ответа @mistermartins:

 $images = scandir($dir);
$listImages=array();
foreach($images as $image) {
    //if already echo'd continue to next iteration
    if (in_array($image, $listImages)) {
        continue;
    }
    //else, add image to array and echo.
    $listImages[] = $image;
    echo substr($image, 0, -25) ."<br>"; //remove last 25 chracters
}
 

Ответ №4:

Должно быть быстрее использовать хэш-карты:

 $images = scandir($dir);
$listImages = array();
foreach($images as $image) {
    if (!isset($listImages[$image])) {
        $listImages[$image] = true;
        echo substr($image, 0, -25) ."<br>"; //remove last 25 chracters
    }
}
 

Ответ №5:

Я не уверен, что я вас полностью понял. Последующий подход сработал для меня, чтобы удалить повторяющиеся значения из массива с помощью цикла foreach.

 $list = array("hans", "peter", "hans", "lara", "peter", "lara", "lara");
sort($list);
foreach ($list as $k => $v) {
     if (isset($check)) {
        if ($check === $v) {
            unset($list[$k]);
        }
     }
     $check = $v;
}

$noDuplicate = array_values($list);

print_r($noDuplicate);
 

дает следующий результат:

Массив ( [0] => ханс [1] => лара [2] => Питер)