首页 > 解决方案 > 如果值为空 ("") 或 (null),则从嵌套/多维数组中删除键

问题描述

我正在阅读这是如何完成的,但是所有这些嵌套让我有点困惑......

这是我当前的代码:

function if_exists($a){
        if(isset($a) && !empty($a)){
            return $a;
        } else {
            return "";
        }
    }

$my_array = array(
    array(
        "@context" => "https://schema.org",
        "@type" => "WebSite",
        "@id" => get_site_url()."#website",
        "name:" => ssd_fallback($myvar['name'],get_bloginfo('name')),
        "headline" => get_bloginfo('description'),
        "description" => $myvar['description'],
        "url" => get_site_url()
    ),
    array(
        "@context" => "https://schema.org",
        "@type" => $myvar['subtype'],
        "@id" => $myvar['org_type'],
        "url" => get_site_url(),
        "name" => get_bloginfo('name'),
        "logo" => $myvar['logo-url'],
        "image" => $myvar['image-url'],
        "description" => $myvar['description'],
        "address" => array(
            "@type" => "PostalAddress",
            "streetAddress" => $myvar['address-street'],
            "addressLocality" => $myvar['address-locality'],
            "addressRegion" => $myvar['address-region'],
            "postalCode" => $myvar['postal-code']
            ),
        "telephone" => $myvar['phone'],
        "email" => $myvar['email'],
        "openingHours" => [$opening_hours],
        "priceRange" => $myvar['price-range'],
        "areaServed" => array(
            array(
                "@type" => "GeoCircle",
                "geoMidpoint" => array(
                    "@type" => "GeoCoordinates",
                    "latitude" => $myvar['geo-lat'],
                    "longitude" => $myvar['geo-lat']
                    ),
                "geoRadius" => $myvar['geo-radius']
                )
        ),
        "sameAs" => array(
            if_exists($myvar['same-as-1']),
            if_exists($myvar['same-as-2']),
            if_exists($myvar['same-as-3']),
            if_exists($myvar['same-as-4']),
            if_exists($myvar['same-as-5']),
        ),
        "hasMap" => $myvar['has-map-url'],
        "geo" => array(
            "@type" => "GeoCoordinates",
            "latitude" => $myvar['geo-lat'],
            "longitude" => $myvar['geo-long']
        ),
        "aggregateRating" => array(
            "@type" => "AggregateRating",
            "ratingValue" => ssd_fallback($gp_avg_star_rating,$myvar['star-rating-manual']),
            "reviewCount" => ssd_fallback($gp_total_reviews,$myvar['nbr-reviews-manual'])
            )
    )
);

$my_json = json_encode($my_array,JSON_PRETTY_PRINT);

echo $my_json;

看着"sameAs"- 你可以看到我正在使用我的功能if_exists

但是,当使用它时,如果没有值,我仍然会得到空字符串(如预期的那样)

例如 JSON 结果:

"sameAs": [
            "https://www.facebook.com/myco/",
            "",
            "",
            "https://www.linkedin.com/company/myco/",
            ""
        ],

而我希望输出看起来像这样:

"sameAs": [
            "https://www.facebook.com/myco/",
            "https://www.linkedin.com/company/myco/"
        ],

通过阅读我已经尝试过array_filter,但这没有用(即使我将if_exists函数更改为 return null);进一步阅读后,它看起来像是因为我手上有一个多维数组)。

我发现了一个正则表达式解决方案,它在json 对象的 strip null 值上似乎很有吸引力(请参阅 Jim S 的回答),但这对我没有任何作用。然而,也许它只需要一个调整?

到目前为止,我从阅读中获得了一些其他选项(超出了我目前的实施能力):

A)专门“定位”元素,例如通过使用“路径”(即,“sameAs”元素中的子项),例如使用unset()PHP 中的数组中删除元素(似乎有不止一种方法可以删除实际上是关键)。

B) 某种函数或循环,这超出了我对 PHP 的理解。

C) 或者可能是上述的组合。☺️

其他想法:

标签: phparraysmultidimensional-arraynested

解决方案


与其在定义数组后清理数组,不如在数组定义中过滤array_filter以删除空值。如果您想要 JSON 中没有索引号的数组定义,请使用array_values

    "sameAs" => array_values(array_filter(array(
        $myvar['same-as-1'],
        $myvar['same-as-2'],
        $myvar['same-as-3'],
        $myvar['same-as-4'],
        $myvar['same-as-5'])
    )),

或者,如果其中只有 5 个值,$myvar或者您想使用其中的所有值,则更简单:

    "sameAs" => array_values(array_filter($myvar)),

请记住,这将过滤掉空字符串""、、null和整数或字符串false0


推荐阅读