1

I have result array and each array index represents combination of various objects (result is from doctrine query).
I want to combine these value to same indexes like you can see in example => Array [0] has 2 object values '0' and name so i want to combine these results to new array in 0 index and so on. So I can perform further processing on new result.

array (size=4)
      0 => 
        object(stdClass)[568]
          public '0' => 
            object(stdClass)[552]
              public 'id' => int 16
              public 'userId' => int 250
              public 'content' => string '<script>alert('Alert');</script>  
    adad adad adad
    ### Heading' (length=61)
          public 'name' => string 'biling' (length=13)
      1 => 
        object(stdClass)[556]
          public '0' => 
            object(stdClass)[554]
              public 'id' => int 15
              public 'userId' => int 250
              public 'content' => string '<script>alert('Alert');</script>  
    adad
    ### Heading' (length=51)
          public 'name' => string 'biling' (length=13)

I tried some code but real problem, I am facing is that it's not removing or unset-ing 0 index and showing offset '0' is undefined

code

    $results = 'Object Result which i shown';        
    $data = array();
    foreach ($results as $key => $item) {

        $resultsCopyArray = array_diff_key((array)$item, [0]);
        //this function must escape 0 index from $item and just add name to $resultsCopyArray but it's now working like it should be

        var_dump(array_keys($resultsCopyArray)); 
        // -> showing 0, name

        // var_dump($resultsCopyArray[0]); -> showing error

        // I also tried to unset this value but noting 

        $data[] = (array)$item->{'0'} + $resultsCopyArray;
    }
    var_dump($data);

1 Answer 1

1

It's one of those "PHP array traps".

array_diff_key uses strict comparison on keys ($k1 === $k2). PHP arrays that was directly constructed (simply saying) use optimisation: numeric strings are converted to numbers. So strict comparison fails: "0" !== 0.

But weak comparison will also fail. You can see it here.

<?php

function key_compare_func($key1, $key2)
{
    var_dump($key1, $key2, $key1 == $key2, $key1 > $key2);
    if ($key1 == $key2)
        return 0;
    else if ($key1 > $key2)
        return 1;
    else
        return -1;
}

$a=new stdClass;
$a->{"0"}=1;
$a->n=2;
echo "key\n";
var_dump(array_diff_key((array)$a, [0]));
echo "ukey\n";
var_dump(array_diff_ukey((array)$a, [0], 'key_compare_func'));

output

key
array(2) {
  ["0"]=>
  int(1)
  ["n"]=>
  int(2)
}
ukey
string(1) "0"
int(0)
bool(true)
bool(false)
string(1) "n"
int(0)
bool(true)
bool(false)
array(0) {
}

If you are sure you have only string keys, use that kind of code

<?php

function key_compare_func($key1, $key2)
{
    if ((string)$key1 == (string)$key2)
        return 0;
    else if ((string)$key1 > (string)$key2)
        return 1;
    else
        return -1;
}

$a=new stdClass;
$a->{"0"}=1;
$a->n=2;
var_dump(array_diff_ukey((array)$a, [0], 'key_compare_func'));

output

array(1) {
  ["n"]=>
  int(2)
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for clarification :) and because of same reason unset() is not working as well ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.