tommyg
tommyg

Reputation: 95

How do I remove values from an array?

This is the code I have written so far:

foreach ($link_body as $key => $unfinished_link)
{   
    #further Remove non ad links
    if (stristr($unfinished_link, "inactive" OR "nofollow") === TRUE)
    {   
        unset($link_body[$key]);
    }   

    echo "<font color='#FFFFFF' size='16'>$unfinished_link</font><br>";
}

I'm not getting any error messages but I keep getting results that look like this:

/cars/" />
/cars/">
/cars/" class="inactive">(not what I wanted)
/cars/" class="inactive">(not what I wanted)
/cars/" class="inactive">(not what I wanted)
/cars/" rel="nofollow">(not what I wanted)
/cars/?layout=gallery" rel="nofollow">(not what I wanted)
/cars/2001-ford-escort-great-condition/1235588">(IS what I wanted)

Where am I messing up here guys? Thx

Upvotes: 1

Views: 60

Answers (5)

Using array_filter :

function filterLink($link) {
 return  stripos($unfinished_link, 'inactive') === false &&
         stripos($unfinished_link, 'nofollow') === false
}

$unfinished_link = array_filter($unfinished_link, "filterLInk")

Upvotes: 1

Kevin
Kevin

Reputation: 41885

If you're trying to find a string inside that, maybe you indend to use stripos instead:

foreach ($link_body as $key => $unfinished_link) {
    // further Remove non ad links
    if(
        stripos($unfinished_link, 'inactive') !== false ||
        stripos($unfinished_link, 'nofollow') !== false
    ) {  
        unset($link_body[$key]);

    } else {
        echo "<font color='#FFFFFF' size='16'>$unfinished_link</font><br>";
        // make sure your background is not white, or else your text will not be seen, at least on the white screen
    }
}

If this is an HTML markup, consider using an HTML parser instead, DOMDocument in particular, and search for that attributes:

$rel = $node->getAttribute('rel'); // or
$class = $node->getAttribute('class');

Upvotes: 1

user4201741
user4201741

Reputation: 11

Do not remove array's element inside foreach statement Remember elements to delete in foreach, delete them after foreach:

$elements_to_delete = {};
foreach ($link_body as $key => $unfinished_link)
{

    if(stristr($unfinished_link, "inactive" OR "nofollow") === TRUE) {   

        $elements_to_delete.push($key);
    }
}

// removing elements after foreach complete
foreach($key in $elements_to_delete){
    $link_body[$key];
}

Upvotes: 1

Serpes
Serpes

Reputation: 672

You echo the variable $unfinished_link that it's different that $link_body[$key]. OK, the values are the same before you unset $link_body[$key] but it's like you are doing:

$a=1;
$b=1;
unset($a);
echo $b;

Of course, this code will echo the number one because I have unset a variable and echo other one. Also the condition of the If is incorrect.

Upvotes: 1

Nick Andriopoulos
Nick Andriopoulos

Reputation: 10643

To my knowledge, you cannot combine parameters in the way you try here :

if(stristr($unfinished_link, "inactive" OR "nofollow") === TRUE)

Instead, you can replace with

if(stristr($unfinished_link, "nofollow") === TRUE) || stristr($unfinished_link, "inactive") === TRUE)

Upvotes: 0

Related Questions