omar dealo
omar dealo

Reputation: 93

How to check if Each value in $array1 the present in $array2 or not

I have known the cause of the problem, not in the code.
Content of the field at the base value of each line separately
So used str_replace to delete the line

$query = $db->query_first("SELECT * FROM table ");
$array1 = explode(",",$query[filed1]);
$array1 = str_replace("\n","",$array1);
$array2 = explode(",",$query[filed2]);
$array2 = str_replace("\n","",$array2);

foreach($array1 as $value)
{
    if (in_array($value,$array2))
    {
        //true
    }else{
        //false
    }
}

I have a problem when I check if Each value in $array2 is present in $array1 or not

Table data:

filed1               | filed2
ahmed,jon,maya,omar  | omar,maya

My code:

$query = $db->query_first("SELECT * FROM table ");
$array1 = explode(",",$query[filed1]);
$array2 = explode(",",$query[filed2]);

        $length = count($array1);
        for ($i = 0; $i < $length; $i++)
        {
            if (in_array($array1[$i] , $array2))
            {
                //true
            }else{
                //false
            }
        }

or this:

$query = $db->query_first("SELECT * FROM table ");
$array1 = explode(",",$query[filed1]);
$array2 = explode(",",$query[filed2]);

foreach($array1 as $value)
{
    if (in_array($value,$array2))
    {
        //true
    }else{
        //false
    }
}

My problem is my code doesn't work good, I am sure that my query gives the results and arrays too.

Output of array1:

Array ( [0] => maya [1] => omar [2] => ahmed [3] => join)

Output of array2:

Array ( [0] => omar [1] => maya )

So, where is the error in my code?!

Note :

I don't want check all value from array2 are in array1, I want check if Each value in $array2 is present in $array1 or not - focus on this word Each value not all value

Like:

if (in_array('omar',$array1))
{
    echo 'found';
}else{
    echo 'not found'; }
    if (in_array('maya',$array1))
    {
        echo 'found';
    }else{
        echo 'not found';
    } 
    if (in_array('jon',$array1))
    { 
        echo 'found';
    }else{
        echo 'not found';
    }
etc ...

But I do not want it this way, I want it inside a loop.

Upvotes: 2

Views: 450

Answers (5)

Jonathan M
Jonathan M

Reputation: 1

@Ghost's solution produced the correct output, but as you state, you know the problem isn't your code. Apparently the problem is that the format of the data you are querying isn't quite matching. So, here is how you can approach debugging this problem:

var_dump() the data

The likely suspect is that some of the data have padding. (It's odd that @Ghost's suggestion of trimming the results didn't work.)

    $array1 = explode(",",$query['filed1']);
    $array2 = explode(",",$query['filed2']);
    var_dump($array1);
    echo "\n";
    var_dump($array2);
    echo "\n";

Inspect comparisons in the iteration

The above should reveal the problem. If not, you could take it a step deeper and see which exact comparison is failing in the in_array. If you don't have xdebug available, just loop within the loop:

    foreach ($array1 as $value) {
        if (in_array($value, $array2)) {
            echo "\n[$value found in \$array2]\n";
        } else {
            echo "\n[$value NOT found in \$array2]\n";
        }

        foreach ($array2 as $value2) {
            if ($value !== $value2) {
                echo "\$array1's '$value' !== \$array2's '$value2'\n";
            } else {
                echo "\$array1's '$value' === \$array2's '$value2'\n";
            }
        }
    }

The output will show you exactly what is wrong.

Note: You should include filed1 and filed2 in quotes since you are using them as string keys. When PHP parses your code, it will emit a notice (error) and fall back on interpreting it as a string.

Upvotes: 0

Scuzzy
Scuzzy

Reputation: 12332

array_diff() is a single function approach to getting an array of items not present in further arrays

$array1 = array('ahmed','jon','maya','omar');
$array2 = array('omar','maya');
$result = array_diff($array1,$array2); // Array ( [0] => ahmed [1] => jon )

you may need to switch parameter order to achieve your desired outcome.

you can also use array_intersect() to perform the reverse

Upvotes: 0

omar dealo
omar dealo

Reputation: 93

I have known the cause of the problem, not in the code ... Content of the field at the base value of each line separately So used str_replace to delete the line

$query = $db->query_first("SELECT * FROM table ");
$array1 = explode(",",$query[filed1]);
$array1 = str_replace("\n","",$array1);
$array2 = explode(",",$query[filed2]);
$array2 = str_replace("\n","",$array2);

foreach($array1 as $value)
{
    if (in_array($value,$array2))
    {
        //true
    }else{
        //false
    }
}

Upvotes: 0

pythonjsgeo
pythonjsgeo

Reputation: 5411

I think you should be iterating over array2 so all values of array2 are checked, not the other way around, because you said: "

check if Each value in $array2...

$query = $db->query_first("SELECT * FROM table ");
$array1 = explode(",",$query['filed1']);
$array2 = explode(",",$query['filed2']);

foreach($array2 as $value)
{
    if (in_array($value,$array1))
    {
        //true
    }else{
        //false
    }
}

Upvotes: 0

Kevin
Kevin

Reputation: 41875

Yes you can use a loop in this case if you really want to, a simple foreach should suffice:

$array1 = array_map('trim', $array1); // on explode make sure remove trailing/leading spaces
$array2 = array_map('trim', $array2);

foreach($array1 as $name) { // so each value of array1
    if(in_array($name, $array2)) { // is compared inside the contents of array2
        // if found
        echo "$name is found in " . '$array2';
    } else {
        echo "$name is NOT found in " . '$array2';
    }
}

Upvotes: 2

Related Questions