简体   繁体   中英

PHP in_array function does not work properly

I have this code that tries to do selection on every new element to put into an array ( $desArray ). It is hoped to not put an element that has the same value as one of the existing elements in the array.

The checking job is supposed to be done by in_array function, which checks if there already is the same title in $rss_array . So the array_push will only be done with the unique ones.

<?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>';
}
?>

What I'm asking is the in_array thing, It doesn't work and gives me this: Notice: Undefined index: (followed by the rss_array[title], repeatedly) Then the results displayed, but the duplicates keep showing up.

I tried to do this:

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

It dismisses the notice thing, but still doesn't dismiss the duplicates. For record, these Google, Bing and Free codes worked very well separately. But when I try to unite the results by removing the duplicates, this "stuckness" happens. How do I solve this? Thank you.. :)

If what you're looking for is making sure the titles are unique, you should try this

replace

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

with

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

This fixes 2 problems:

  1. $rss_item[$item->Title] is probably supposed to be $rss_item['Title'] , but that's equal to $item->Title .
  2. You don't want to search $rss_array for $item->Title , you want to search the 'Title' key of all arrays in $rss_array for $item->Title , which is what array_map does.

More reading:

You're using incorrect paramaters.

From in_array() documentation:

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.

I doubt if that's what you want.

Try the following:

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

//code

}

Or even:

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

Hope this helps!

Maybe you should create a rss_titles helper array like this

$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);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM