#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], но все тот же ..результат