2013-08-06 7 views
0

У меня есть этот код, который пытается сделать выбор для каждого нового элемента, который будет помещен в массив ($desArray). Можно надеяться не поместить элемент, который имеет то же значение, что и один из существующих элементов массива.Функция PHP in_array не работает должным образом

Задача проверки должна выполняться функцией in_array, которая проверяет, существует ли уже такое же название в $rss_array. Таким образом, array_push будет выполнен только с уникальными.

<?php 

/* GOOGLE */ 

function cURL_google($url, $ref, $p) { 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
curl_setopt($ch, CURLOPT_REFERER, $ref); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
if ($p) { 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $p); 
} 
$result = curl_exec($ch); 
curl_close($ch); 
if ($result) { 
    return $result; 
} else { 
    return ''; 
} 
} 

if (isset($_GET['keyword'])) { 
$keyword_google = $_GET['keyword']; 
} else { 
echo 'Wrong!'; 
} 

$cseNumber = 'AAAAA'; 
$key = 'AAAAAP'; 
$rss_array = array(); 
$desArray = array(); 

function _json_decode($file) { 
    if (get_magic_quotes_gpc()) { 
    $file = stripslashes($file); 
    } 
    return json_decode($file); 
} 
$file = cURL_google('https://www.googleapis.com/customsearch/v1?key=' . $key . '&cx=' .    $cseNumber . '&q=' . $keyword_google . '&siteSearchFilter=i&alt=json&start=1&num=3', 'https://www.googleapis.com/customsearch/v1?key=' . $key . '&cx=' . $cseNumber . '&q=' . $keyword_google . '&siteSearchFilter=i&alt=json&start=1&num=3', null); // . removed from here 
$feed = _json_decode($file, true); 
foreach ($feed->items as $item) { 
$rss_item = array(
    'kind' => $item->kind, 
    'Title' => $item->title, 
    'Url' => $item->link, 
    'Description' => $item->snippet, 
    'formattedUrl' => $item->formattedUrl, 
); 
array_push($desArray, $item->snippet); 
array_push($rss_array, $rss_item); 
} 

/* BING */ 
if (isset($_GET['keyword'])) { 
$rawkeyword = '%27' . $_GET['keyword'] . '%27'; 
$keyword = str_replace(' ', '%27', $rawkeyword); 
//echo $keyword . '<br>'; 
} else { 
echo 'Wrong!'; 
} 

$key_bing = 'AAAAAA'; 
$root = 'https://api.datamarket.azure.com/Bing/Search/'; 
$search = $root . 'Web?'; 
$req = $search . 'Query=' . $keyword . '&$top=3&$format=json'; 

$ch = curl_init($req); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_USERPWD, $key . ":" . $key_bing); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
$resp = curl_exec($ch); 
$json = json_decode($resp); 

foreach ($json->d->results as $item) { 
$rss_item = array(
    'Title' => $item->Title, 
    'Description' => $item->Description, 
    'DisplayUrl' => $item->DisplayUrl, 
    'Url' => $item->Url, 
); 
if (in_array($rss_item[$item->Title], $rss_array, TRUE)) { 
    return false; 
} else { 
    array_push($desArray, $item->Description); 
    array_push($rss_array, $rss_item); 
} 
} 

/* FREE */ 
if (isset($_GET['keyword'])) { 
$rawkeyword = $_GET['keyword']; 
$keyword = str_replace(' ', '%20', $rawkeyword); 
echo $keyword . '<br>'; 
} else { 
echo 'Wrong!'; 
} 
$rootkiri = 'http://www.faroo.com/api?q='; 
$key_free = '&key=AAAAAA'; 
$rootkanan = '&start=1&length=3&l=en&src=web&f=json'; 
$req = $rootkiri . $keyword . $rootkanan . $key_free; 

$ch_free = curl_init($req); 
curl_setopt($ch_free, CURLOPT_TIMEOUT, 30); 
curl_setopt($ch_free, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch_free, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch_free, CURLOPT_SSL_VERIFYPEER, false); 

$resp_free = curl_exec($ch_free); 
$json_free = json_decode($resp_free); 
foreach ($json_free->results as $item) { 
if (isset($item->kwic)) { 
    $rss_item = array(
     'Title' => $item->title, 
     'Description' => $item->kwic, 
     'Url' => $item->url, 
    ); 
    if (in_array($rss_item[$item->title], $rss_array, TRUE)) { 
     return false; 
    } else { 
     array_push($desArray, $item->kwic); 
    } 
} else { 
    return false; 
} 
if (in_array($rss_item[$item->title], $rss_array, TRUE)) { 
    return false; 
} else { 
    array_push($rss_array, $rss_item); 
} 
} 

/* DISPLAYING RESULT */ 
for ($i = 0; $i < count($desArray); $i++) { 
    echo '<p>' 
    . '<a href="' . $rss_array[$i]['Url'] . '" onclick="return false;">' 
    . '<img src="images/positif.png" title="rate this positive" onclick="positif(this);">' 
    . '<img src="images/negatif.png" title="rate this negative" onclick="negatif(this);">' 
    . $rss_array[$i]['Title'] 
    . '</a>' 
    . '<a href="' . $rss_array [$i]['Url'] . '" target="_blank">' 
    . '<img src="images/open_new_tab.jpg" title="open in new tab">' 
    . '</a>' 
    . '<br/>' 
    . '<span class="deskripsi">' . $rss_array [$i]['Description'] . '</span>' 
    . '<hr/>' 
    . '</p>'; 
} 
?> 

Что я спрашиваю это in_array вещь, Она не работает и дает мне это: Notice: Undefined index: (с последующим rss_array [TITLE], неоднократно) отображается Затем результаты, но дубли продолжают появляться.

Я пытался сделать это:

if (in_array($item->title, $rss_array, TRUE)) { 

Он отклоняет уведомление вещь, но до сих пор не отвергает дубликаты. Для записи эти коды Google, Bing и Free работали очень хорошо по отдельности. Но когда я пытаюсь объединить результаты, удаляя дубликаты, это «застревание» происходит. Как это решить? Спасибо .. :)

+0

я думаю, что ваш $ rss_array многомерна (вы оттолкнул массив в него) и проверяется на строку ($ item-> title) в вашем in_array(). Это не сработало. Возможно, попробуйте 'in_array ($ rss_item, $ rss_array, TRUE)', но это будет работать, только если весь $ rss_item будет таким же. Не только название. – steven

+0

Я не думаю, что это сработало бы потому, что описание так сильно изменится. :( – Safira

+0

Итак, создайте заголовок_имя с заголовками и сделайте in_array с этим массивом. Если он не существует в массиве заголовков, то нажмите rss_item на rss_array и название для title_array. – steven

ответ

0

Может быть, вы должны создать rss_titles вспомогательный массив как этот

$rss_array = array(); 
$rss_titles = array(); 

foreach(...) { 
    if (in_array($item->title, $rss_titles)) { 
     //return false; 
     continue; // Maybe you dont want to return false but to continue... 
    } else { 
     // you only need to create $rss_item if the title is not in_array: 
     $rss_item = array(
      'Title' => $item->title, 
      'Description' => $item->kwic, 
      'Url' => $item->url, 
     ); 
     array_push($rss_array, $rss_item); 
     array_push($rss_titles, $item->title); 
    } 
} 
+0

Гоша, ты спас мне жизнь, спасибо :) – Safira

0

Вы используете неправильные параметры.

Из in_array() документации:

If the third parameter strict is set to TRUE then the in_array() function will also check the types of the needle in the haystack. 

Я сомневаюсь, что это то, что вы хотите.

Попробуйте следующее:

if (in_array($item->title, $rss_array) == TRUE) { 

//code 

} 

Или даже:

if(in_array($item->title, $rss_array)){ 

Надеется, что это помогает!

+0

Я думаю, что это не сработает, потому что $ rss_array не является массивом названий. Это массив массивов с индексом с именем 'Title' в каждом. – steven

+0

Amal: Спасибо, но все равно не работает. : (( ) Стивен: да, я так думаю, но я не понимаю, как подтянуть массив внутри массива к внешнему массиву вроде этого. TT – Safira

+0

Помогает, если вы отправляете 'print_r ($ post)' output. –

1

Если то, что вы ищете, убедившись, что названия являются уникальными, вы должны попробовать это

заменить

if (in_array($rss_item[$item->Title], $rss_array, TRUE)) {

с

if (in_array($item->Title, array_map(function($e) { return $e['Title']; }, $rss_array))) {

Это исправляет 2 проблемы:

  1. $rss_item[$item->Title], вероятно, должен быть $rss_item['Title'], но это равно $item->Title.
  2. Вы не хотите искать $rss_array для $item->Title, вы хотите найти ключ «Title» всех массивов в $rss_array для $item->Title, что и array_map делает.

Больше чтение:

Смежные вопросы