将Object转换为显示未定义偏移的Array键后


After converting Object to Array key showing undefined offset

我有一个结果数组,每个数组索引表示各种对象的组合(结果来自条令查询)
我想将这些值组合到相同的索引中,就像您在示例=>中看到的那样。Array[0]有两个对象值"0"和名称,所以我想将它们组合到0索引中的新数组中,依此类推。这样我就可以对新结果进一步处理。

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)

我尝试了一些代码,但我面临的真正问题是,它没有删除或取消设置0索引,并且显示偏移量"0"是未定义的

代码

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

这是一个"PHP数组陷阱"。

array_diff_key使用密钥上的严格比较($k1 === $k2)。直接构建的PHP数组(简单地说)使用优化:将数字字符串转换为数字。所以严格的比较失败了:"0" !== 0

但微弱的比较也会失败。你可以在这里看到。

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

输出

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) {
}

如果你确定你只有字符串键,请使用代码

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

输出

array(1) {
  ["n"]=>
  int(2)
}