#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] => Питер)