首页 > 解决方案 > PHP从对象中删除空项目

问题描述

我有以下对象,这里打印为数组。该对象是根据 SOAP 请求构建的。

AdminInfo Object (
  [Supplier] => Supplier Object (
      [Party] => Party Object (
          [OrgInfo] => OrgInfo Object (
              [CompanyName] => Bobs
              [IDInfo] => Array of IDInfo Objects (
                  [0] => IDInfo Object (
                      [IDQualifierCode] => 
                      [IDNum] => 
                    )
                  [1] => IDInfo Object (
                      [IDQualifierCode] => CompanyID
                      [IDNum] => 83e26599-d40g-4cba-9791-7d7c83de282c
                    )
                  [2] => IDInfo Object (
                      [IDQualifierCode] => TID
                      [IDNum] => BOBTID01020304
                    )
                  [3] => IDInfo Object (
                      [IDQualifierCode] => Token
                      [IDNum] => c784570e-044d-42c8-98fe-af9f7c1747f5
                    )
                )
            )
          [ContactInfo] => ContactInfo Object (
              [ContactJobTitle] => 
              [Communications] => Comm Object (
                  [CommQualifier] => 
                  [CommPhone] => 
                  [CommEmail] => 
                  [Address] => Address Object (
                      [Address1] => 
                      [Address2] => 
                      [City] => 
                      [StateProvince] => 
                      [PostalCode] => 
                      [CountryCode] => 
                    )
                )
              [ContactName] => PersonName Object (
                  [FirstName] => 
                  [MiddleName] => 
                  [LastName] => 
                )
            )
        )
    )
  [Company] => Company Object (
      [Party] => Party Object (
          [OrgInfo] => OrgInfo Object (
              [CompanyName] => SF
              [IDInfo] => 
            )
          [ContactInfo] => 
        )
    )
  [Facility] => Facility Object (
      [Party] => Party Object (
          [OrgInfo] => Array of OrgInfo Objects (
            )
          [ContactInfo] => ContactInfo Object (
              [ContactJobTitle] => Owner
              [Communications] => Array of Comm Objects(
                  [0] => Comm Object (
                        [CommQualifier] => WP
                        [CommPhone] => 1234567890
                    )
                  [1] => Comm Object (
                        [CommQualifier] => SA
                        [Address] => Address Object (
                            [Address1] => 123 NE 14th St 
                            [City] => Nowhere
                            [StateProvince] => ND
                            [PostalCode] => 12345
                            [CountryCode] => US
                          )
                      )
                  [2] => 
                  [3] => 
                )
              [ContactName] => PersonName Object (
                  [FirstName] => Bob
                  [MiddleName] => 
                  [LastName] => Tester
                )
            )
        )
    )
)

我想要做的是删除所有空元素并与这个对象一起返回

AdminInfo Object (
  [Supplier] => Supplier Object (
      [Party] => Party Object (
          [OrgInfo] => OrgInfo Object (
              [CompanyName] => Bobs
              [IDInfo] => Array of IDInfo Objects (
                  [0] => IDInfo Object (
                      [IDQualifierCode] => 
                      [IDNum] => 
                    )
                  [1] => IDInfo Object (
                      [IDQualifierCode] => CompanyID
                      [IDNum] => 83e26599-d40g-4cba-9791-7d7c83de282c
                    )
                  [2] => IDInfo Object (
                      [IDQualifierCode] => TID
                      [IDNum] => BOBTID01020304
                    )
                  [3] => IDInfo Object (
                      [IDQualifierCode] => Token
                      [IDNum] => c784570e-044d-42c8-98fe-af9f7c1747f5
                    )
                )
            )
        )
    )
  [Company] => Company Object (
      [Party] => Party Object (
          [OrgInfo] => OrgInfo Object (
              [CompanyName] => SF
            )
        )
    )
  [Facility] => Facility Object (
      [Party] => Party Object (
          [ContactInfo] => ContactInfo Object (
              [ContactJobTitle] => Owner
              [Communications] => Array of Comm Objects (
                  [0] => Comm Object (
                        [CommQualifier] => WP
                        [CommPhone] => 1234567890
                    )
                  [1] => Comm Object (
                        [CommQualifier] => SA
                        [Address] => Address Object (
                            [Address1] => 123 NE 14th St 
                            [City] => Nowhere
                            [StateProvince] => ND
                            [PostalCode] => 12345
                            [CountryCode] => US
                          )
                      )
                )
              [ContactName] => PersonName Object (
                  [FirstName] => Bob
                  [LastName] => Tester
                )
            )
        )
    )
)

这些尝试根本不这样做。变量$AdminInfo是上面的对象...

从这里的解决方案:去除 json 对象的空值

$json = json_encode($AdminInfo);
$result = preg_replace('/,\s*"[^"]+":null|"[^"]+":null,?/', '', $json);
$echo $result;

从这里的解决方案:如何从数组中删除空值?

$json = json_encode($AdminInfo);                // convert to JSON
$arr = (array)json_decode($json);               // convert to an array
$object = (object) array_filter((array) $arr);  // filter the array
$result = json_encode($object);                 // convert it back to JSON
echo $result;

从这里开始:PHP - 如何递归地删除数组的空条目?

function array_remove_empty($haystack)
{
    foreach ($haystack as $key => $value) {
        if (is_array($value)) {
            $haystack[$key] = array_remove_empty($haystack[$key]);
        }

        if (empty($value)) {
            unset($haystack[$key]);
        }
    }

    return $haystack;
}

$json = json_encode($AdminInfo);          // convert to JSON
$arr = (array)json_decode($json);         // convert to an array
print_r(array_remove_empty($arr));        // run through array_remove_empty function and print

从这里的解决方案:从 PHP 中的多维数组中删除项目

function cleanArray($array) {
    if (is_array($array)) {
        foreach ($array as $key => $sub_array)
        {
            $result = cleanArray($sub_array);
            if ($result === false) {
                unset($array[$key]);
            } else {
                $array[$key] = $result;
            }
        }
    }
    if (empty($array)) {
        return false;
    }
    return $array;
}

$json = json_encode($AdminInfo);          // convert to JSON
$arr = (array)json_decode($json);         // convert to an array
print_r(cleanArray($arr));                // run through cleanArray function and print


将 AdminInfo 对象编辑为 JSON:

{
    "Supplier":{
        "Party":{
            "OrgInfo":{
                "CompanyName":"Bobs",
                "IDInfo":[
                    {
                        "IDQualifierCode":null,
                        "IDNum":""
                    },
                    {
                        "IDQualifierCode":"CompanyID",
                        "IDNum":"83e26599-d40g-4cba-9791-7d7c83de282c"
                    },
                    {
                        "IDQualifierCode":"TID",
                        "IDNum":"BOBTID01020304"
                    },
                    {
                        "IDQualifierCode":"Token",
                        "IDNum":"c784570e-044d-42c8-98fe-af9f7c1747f5"
                    }
                ]
            },
            "ContactInfo":{
                "ContactJobTitle":"",
                "Communications":{
                    "CommQualifier":null,
                    "CommPhone":"",
                    "CommEmail":"",
                    "Address":{
                        "Address1":"",
                        "Address2":"",
                        "City":"",
                        "StateProvince":null,
                        "PostalCode":"",
                        "CountryCode":null
                    }
                },
                "ContactName":{
                    "FirstName":"",
                    "MiddleName":"",
                    "LastName":""
                }
            }
        }
    },
    "Company":{
        "Party":{
            "OrgInfo":{
                "CompanyName":"SF",
                "IDInfo":null
            },
            "ContactInfo":null
        }
    },
    "Facility":{
        "Party":{
            "OrgInfo":[

            ],
            "ContactInfo":{
                "ContactJobTitle":"",
                "Communications":[
                    {
                        "CommQualifier":null,
                        "CommPhone":"",
                        "CommEmail":"",
                        "Address":{
                            "Address1":"",
                            "Address2":"",
                            "City":"",
                            "StateProvince":null,
                            "PostalCode":"",
                            "CountryCode":null
                        }
                    },
                    null,
                    null,
                    null
                ],
                "ContactName":{
                    "FirstName":"Bob",
                    "MiddleName":"",
                    "LastName":"Tester"
                }
            }
        }
    }
}

标签: phparraysjsonobject

解决方案


要求:递归扫描嵌套数组,删除空分支/项目。

这是另一个“树漫步”。

唯一“棘手”的部分是让树的上层处理知道是否将当前项目添加到输出树中。

处理节点的函数将返回一个数组,该数组具有“保留值”标志以及要保留的值。

JSON 转换为数组:eval.in 的完整工作代码

输出保留原始 JSON 数据类型:eval.in 的完整工作代码

代码:

function processList(array $list)
{
    $listResult = ['keepValue' => false, // once set true will propagate upward
                    'value'       => []];

    foreach ($list as $name => $item ) {
        if (is_null($item)) { // see is_scalar test
            continue;
        }

        if (is_scalar($item)) { // keep the value?
            if (!empty($item) || strlen(trim($item)) > 0) {
                $listResult['keepValue'] = true;
                $listResult['value'][$name] = $item;
            }

        } else { // new list... recurse

            $itemResult = processList($item);
            if ($itemResult['keepValue']) {
                $listResult['keepValue'] = true;
                $listResult['value'][$name] = $itemResult['value'];
            }
        }
    }   
    return $listResult;
}    

运行函数:

$source = json_decode($json, true);
$result = processList($source);
print_r($result['value']);

输出:

Array
(
    [Supplier] => Array
        (
            [Party] => Array
                (
                    [OrgInfo] => Array
                        (
                            [CompanyName] => Bobs
                            [IDInfo] => Array
                                (
                                    [1] => Array
                                        (
                                            [IDQualifierCode] => CompanyID
                                            [IDNum] => 83e26599-d40g-4cba-9791-7d7c83de282c
                                        )
                                    [2] => Array
                                        (
                                            [IDQualifierCode] => TID
                                            [IDNum] => BOBTID01020304
                                        )
                                    [3] => Array
                                        (
                                            [IDQualifierCode] => Token
                                            [IDNum] => c784570e-044d-42c8-98fe-af9f7c1747f5
                                        )
                                )
                        )
                )
        )
    [Company] => Array
        (
            [Party] => Array
                (
                    [OrgInfo] => Array
                        (
                            [CompanyName] => SF
                        )
                )
        )
    [Facility] => Array
        (
            [Party] => Array
                (
                    [ContactInfo] => Array
                        (
                            [ContactName] => Array
                                (
                                    [FirstName] => Bob
                                    [LastName] => Tester
                                )
                        )
                )
        )
)

推荐阅读