Потратил часы на чтение, исследование и не мог понять, вот мой код:
<?php
$userid = "";
$accessToken = "";
function fetchData($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$result = fetchData("https://api.instagram.com/v1/users/{$userid}/media/recent/?access_token={$accessToken}&count=-1");
$result = json_decode($result);
?>
<?php foreach ($result->data as $post):{
if (stripos($post->caption->text,'egypt') !== false) {
unset($post);
$post = (str_split($post->caption->text));
$post = (array_filter($post));
}
}
?>
<img src="<?= $post->images->low_resolution->url?>" />
<?= $post->caption->text ?>
<?php endforeach ?>
Как вы видите, я пытаюсь исключить ответы с помощью «египта», упомянутого в них, я успешно смог сделать это с помощью unset. Однако я все еще получаю пустые элементы, даже когда использую array_filter. HTML выглядит так: <img src="" />
(как вы могли себе представить) для фотографий Египта.
Это то, что я не понимаю:
<?php foreach ($result->data as $post):
{
if (stripos($post->caption->text,'egypt') !== false) {
}
else{
unset($post);
$posta = (str_split($post->caption->text));
$posta = (array_filter($post));
$posta = array_filter($posta, 'strlen' );
}
}
?>
<img src="<?= $post->images->low_resolution->url?>" /><br>
<?= $post->caption->text ?><br><br>
<?php endforeach ?>
Дает мне результаты, которые я хочу (только фотографии и описания Египта), но также дает ошибку PHP для каждого: Warning: array_filter() expects parameter 1 to be array, null given' and
Предупреждение: array_filter () ожидает, что параметр 1 будет массивом, если задано значение null`, не должен ли array_filter удалять нулевые значения? Я просто хотел бы заменить ошибки ни с чем.
Я бы предложил изменить ваш цикл на что-то вроде следующего:
Распечатывайте только тогда, когда «Египет» не найден.
<?php foreach ($result->data as $post){
if (stripos($post->caption->text,'egypt') === false) {
$post = (str_split($post->caption->text));?>
<img src="<?= $post->images->low_resolution->url?>" />
<?= $post->caption->text ?>
<?php
}
else{
unset $post;
}
?>
В качестве альтернативы вы можете сначала очистить массив в одном цикле, а затем распечатать записи в другом цикле. Это может упростить добавление дополнительных «фильтров» позже.
<?php
//edit --- typos clean_aray = array();
$clean_array = array();
foreach ($result->data as $post){
if (stripos($post->caption->text,'egypt') === false) {
$clean_array[] = $post;
}
}
foreach ($clean_array as $post){
$post = (str_split($post->caption->text));?>
<img src="<?= $post->images->low_resolution->url?>" />
<?= $post->caption->text ?>
<?php
}
?>
Вы можете использовать array_filter с функцией обратного вызова, такой как strlen, это удалит NULL, пустые строки и FALSE, и под false я подразумеваю, что явно FALSE, а не 0
$result = array_filter( $array, 'strlen' );