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

#php

#php

Вопрос:

У меня есть 3 таких массива из цикла foreach

 $link = 'https://example.com/page/';
$parse = explode('/', $link);
for ($i = 0;$i <= 5;$i  )
{
    if($i > 0) {
        $link = $parse[0]."//".$parse[1]."/".$parse[2]."/".$parse[3]."/".$parse[4].$i;
        $get[$i] = curl($link);
        $re = '/class="img-lazy" src="(.*?)"/m';
        preg_match_all($re, $get[$i], $matches);
        foreach ($matches[1] as $content)
            {
                echo $content. "rn";
            }
    }
}
  

(цикл с каждой страницы, например: example.com/page/1 будет содержать приведенный ниже массив и так далее со страницы 2/3 …)

Результат:

 Array (Page 1)
(
    [0] => https://example.com/img1.jpg
    [1] => https://example.com/img2.jpg

)
Array (Page 2)
(
    [0] => https://example.com/img3.jpg
    [1] => https://example.com/img4.jpg

)
Array (Page 3 nonexist auto redirect to page 1)
(
    [0] => https://example.com/img1.jpg
    [1] => https://example.com/img2.jpg

)
  

Последнее значение дублируется. Как мне его удалить?

Я уже пытался объединить функцию array и array_unique. Но дубликат все еще там.

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

1. «Страница 3 не существует, поэтому вернитесь на страницу 1», так почему вы не можете просто не возвращать страницу 1 для несуществующих страниц?

2. @MagnusEriksson Страница автоматически перенаправляется на страницу 1, и мой код продолжает получать первую страницу. Я обновил ссылку, пожалуйста, взгляните!

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

4. Я попробовал if(strcasecmp($link,$link2==-2)) Продолжайте цикл, затем elseif (strcasecmp($link,$link2==0)) выход

5. Попробуйте $all_array = (array) $matches[1]; . Добавьте $all_array в мою функцию.

Ответ №1:

Быстрое решение запустите цикл for только 5 раз, если цикл динамический, следуйте этому ответу

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

ваши изображения хороши 🙂

 $get = array();
$firstcompare = 0;              
$firsttime = 1;
for ($i = 0;$i <= 17;$i  )
{
    if($i > 0) {
        $dup = $res = [];
        $link = $parse[0]."//".$parse[1]."/".$parse[2]."/".$parse[3]."/".$parse[4].$i;
        $get[$i] = curl($link);
        $re = '/class="aligncenter" src="(.*?)"/m';
        preg_match_all($re, $get[$i], $matches);
        if($firsttime){
            $stringlink = $matches[1][0];
            $firsttime = 0;
        }       
        foreach ($matches[1] as $content)
        {       
            if($firstcompare){
                if ($stringlink==$content) {
                    exit;
                }else{
                    // echo $content."nn";
                    echo "<img src=' $content ' /> " . "rn";
                }
            }else{
                    // echo $content."nn";
                    $firstcompare = 1;              
                    echo "<img src=' $content ' /> " . "rn";              
            }
        }
    }
}
  

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

1. @Enuma Можете ли вы повторить $link проверку в каждом цикле, все ли изображения существуют на сервере? У меня есть другое решение, но перед этим я хочу точно знать, где это происходит [ Page 3 nonexist auto redirect to page 1 ] . Также покажите мне содержимое для $matches[1]

2. Это решило мою проблему. Большое вам спасибо, Раса 😉 Да, эти изображения хороши, ха-ха

Ответ №2:

Вы можете попробовать это в соответствии с YourArray, надеюсь, это поможет вам

Использование Foreach:

 $dup = $res = [];
foreach($yourArray as $arr){
    $imploded = @implode(',',$arr);
    if(!in_array($imploded, $dup)){
        $dup[] = $imploded;
        $res[] = $arr;
    }
} 
  

(или)

Использование функции массива:

 $unique = array_unique(array_map(function($arr){ 
    return @implode(',',$arr); 
}, $yourArray));
$mapped = array_map(function($a){ 
    return @explode(',', $a); 
}, $unique_data);
  

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

1. Я попробовал, но работает не так, как я ожидал. Повторяющийся результат все еще существует.

Ответ №3:

Я действительно не все понимаю, но для удаления повторяющихся данных внутри массива вы можете использовать array_unique() функцию.

 foreach(array_unique($yourArray) as $value):
   // Code goes here
endforeach;
  

Он принимает массив и возвращает чистый
https://www.php.net/manual/fr/function .array-unique.php

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

1. Я уже попробовал, но массив отдельный. Не один массив

2. Примечание: Обратите внимание, что array_unique () не работает с многомерными массивами.

Ответ №4:

Вот лучший способ удалить повторяющиеся значения из многомерного массива с помощью PHP или Laravel.

Решение:

 $input = array_map("unserialize", array_unique(array_map("serialize", $input)));
  

 $input = Array
(
    [0] => Array
    (
        [0] => abc
        [1] => def
    )

    [1] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [2] => Array
    (
        [0] => mno
        [1] => pql
    )

    [3] => Array
    (
        [0] => abc
        [1] => def
    )

    [4] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [5] => Array
    (
        [0] => mno
        [1] => pql
    )

)



$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
  

Вывод :

  Array
    (
        [0] => Array
        (
            [0] => abc
            [1] => def
        )

        [1] => Array
        (
            [0] => ghi
            [1] => jkl
        )

        [2] => Array
        (
            [0] => mno
            [1] => pql
        )

        [3] => Array
        (
            [0] => ghi
            [1] => jkl
        )

        [4] => Array
        (
            [0] => mno
            [1] => pql
        )

    )
  

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

1. Массив находится на каждой странице, для получения которой я использовал preg_match_all. Это не так. Его единственное Array ( [0] => https://example.com/img1.jpg [1] => https://example.com/img2.jpg Array ( [0] => https://example.com/img3.jpg [1] => https://example.com/img4.jpg )

2. @Enuma Это всего лишь массив. Так выглядит ввод и вывод. массив (массив(‘1’ => 1, ‘2’ => 2)). Просто попробуйте мое решение, оно решит вашу проблему. $input = array_map("unserialize", array_unique(array_map("serialize", $your_array))); В этом просто $your_array замените свою переменную массива

3. Я заменил его на $matches[1], но все тот же ..результат