对不起,我甚至不确定如何说出我的问题。
我正在尝试使用奇怪的设置从公共JSON API中删除个人注册人信息。例如:
"posts" : [
{
"id": 9658,
"type": "event",
"custom_fields" : {
"registered_person_0_name" : [ "John" ],
"registered_person_1_name" : [ "Doe" ]
}
如果有帮助,这是var_dump
:
["custom_fields"]=>
object(stdClass)#6601 (45) {
["registered_person_0_name"]=>
array(1) {
[0]=> string(8) "Beverley"
}
根据事件,注册人数量不明,每个字段都会增加,如图所示。我想我会unset()
所有“注册人”的例子,但我很难过。
如果给出$posts
,我觉得我可以这样做:
foreach ( $posts as $post ) {
unset( $post->custom_fields->all_the_registered_persons_fields_that_match)
}
但我无法弄明白。我尝试将custom_fields
对象类型转换为数组并使用in_array
,然后使用unset
,但这似乎不起作用。
我感谢任何指针。如果我能提供进一步的信息,请告诉我。
答案 0 :(得分:3)
循环遍历属性变量,如果它们与模式匹配,则取消设置它们。
foreach ($posts as $post) {
$custom_fields = $post->custom_fields;
foreach (get_object_vars($custom_fields) AS $name => $val) {
if (preg_match('/^registered_person_\d+_name$/', $name)) {
unset($custom_fields->{$name});
}
}
}
另一种选择是使用json_decode()
的可选参数,以便它返回关联数组而不是对象。然后你可以在数组上使用foreach
。
foreach ($posts as &$post) {
$custom_fields = &$post['custom_fields'];
foreach ($custom_fields AS $name => $val) {
if (preg_match('/^registered_person_\d+_name$/', $name)) {
unset($custom_fields[$name]);
}
}
}
请注意,在这种情况下,您必须使用引用变量,因为分配数组通常会复制。
答案 1 :(得分:0)
假设您有一个包含要删除的字段的数组,可以使用->{$propName}
来实现此目的。 ->{$someVar}
允许您动态访问对象的属性。
例如:
$field1 = "name";
echo($object->{$field}) // will echo the name property
在你的情况下:
$sensibleFields = ['creditCardNumber', 'socialSecurityNumber'];
foreach ($posts as $post) {
foreach ($sensibleFields as $fieldName) {
unset($post->{$fieldName});
}
}
答案 2 :(得分:0)
如果使用json_decode($the_api_data, true)
获取结果数组样式而不是对象样式,则可以使用array_filter
删除不需要的键。
foreach ($posts as &$post) { // need to use a reference here for this to work
$post['custom_fields'] = array_filter($post['custom_fields'], function($key){
return 'registered_person_' != substr($key, 0, 18);
}, ARRAY_FILTER_USE_KEY);
}