2016-01-11 106 views
0

對不起,我甚至不太確定如何說出我的問題。如何從對象中刪除包含字符串的數組?

我想從一個奇怪的設置公共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()「registered_person」的所有實例,但我很難過。

如果給$posts,我覺得我可以做這樣的事情:

foreach ($posts as $post) { 
    unset($post->custom_fields->all_the_registered_persons_fields_that_match) 
} 

但我不能完全弄清楚。我曾嘗試使用in_array,然後unset來排列custom_fields對象,但這似乎不起作用。

我很欣賞任何指針。讓我知道我是否可以提供更多信息。

+0

這肯定是一個嚴重的有組織的數據結構要刪除只是'registered_person_0_name,registered_person_1_name – RiggsFolly

+0

做.....'或'全custom_fields' – RiggsFolly

+0

這肯定是:/ @RiggsFolly。我想刪除'registered_person _#_ name' ...但保留自定義字段。 FWIW這是一箇舊的WordPress JSON API。 – mschofield

回答

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]); 
     } 
    } 
} 

請注意,在這種情況下,您必須使用引用變量,因爲分配數組通常會進行復制。

+0

謝謝@Barmar。我想我已經接近這個了,但'get_object_vars'完全是關鍵。我很感激! – mschofield

+0

你也可以使用'json_encode'選項來返回數組而不是對象。 – Barmar

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}); 
    } 
} 
+0

謝謝@cristik。我之前曾有過一些遠見的「 - > {$ someVar}」,但沒有理解它的用法。 – mschofield

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); 
} 
相關問題