php - 如果值为空 ("") 或 (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) 或者可能是上述的组合。☺️
其他想法:
- 以不同的方式编写数组是否有助于使这更容易?
- 和/或是否有更直接的方法来引用一个键,而不必深入到嵌套的每一层?
- 文本编辑器或其他工具是否可以帮助我获取这些数组元素的路径(关于选项 A)?
解决方案
与其在定义数组后清理数组,不如在数组定义中过滤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
和整数或字符串false
。0
推荐阅读
- javascript - 将反应虚拟化表从 javascript 转换为 typescript - 类型问题
- lua - 如何使用 pandoc 与 lua-filters 对齐文本?
- python - 在发送 Python smtplib 之前检查电子邮件的完整大小
- python - 如何在python列表中找到除0之外的任何数字的第一个索引?
- php - 如何在 Laravel Blade @each 中获得迭代值?
- minikube - 节点容器无法从 minikube 但从本地机器连接到 atlas 集群
- asp.net - 适用于 Google Chrome 和 Edge 的 Windows Kerberos 身份验证
- amazon-web-services - 在 AWS 架构中限制外部 API 调用
- xamarin.forms - 从左方向进行页面导航
- android - Firebase 通知使我的应用程序在前台崩溃