2017-05-02 65 views
0

這已經讓我的腦子好幾天了。我以爲我有一個解決方案,但我發現很難找出一個始終工作的防彈片代碼。我正在遍歷一個多維數組。我有兩個函數,一個查看單個行,另一個查看數組。我有兩個數組的配置。多維數組可以包含單個元素或另一個數組。如何遍歷?

第一示例

[ 
    'Person' => [ 
     'Name' => 'John Smith' 
    ] 
] 

(一個單一結果爲人,只有一個用於該人的名字)

第二示例

[ 
    'Person' => [ 
     'Name' => [ 
      0 => 'John Smith', 
      1 => 'John Denver' 
     ] 
    ] 
] 

(其中單人,該人有多個名字。)

第三個例子

[ 
    'Person' => [ 
     0 => [ 
      'Name' => 'John Smith' 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
] 

(兩個人,每個只有一個名字。)

第四例子

[ 
    'Person' => [ 
     0 => [ 
      'Name' => [ 
       0 => 'John Smith', 
       1 => 'John Denver' 
      ] 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
] 

(兩個人,第一個擁有兩個名字,第二隻有一個)

希望這可以理解我在說什麼。當只有一條記錄時,它會返回單條記錄。如果有多條記錄,則會有一個包含每條記錄的數組。

我需要從開始到結束通過多維數組對橫向。我想弄清楚如何檢查是否有單個答案或多個答案。

我曾嘗試檢查數組鍵名,檢查是否鑰匙是整數VS字符串,如果事情是一個數組與否。

沒有什麼比我想象的更有效。任何人都可以幫助提供一種方法橫向和檢查使用例如一個foreach循環或函數?

如果有幫助,我有一個包含它試圖尋找鍵字段的名稱另一個數組。該陣列將具有類似的佈局:

[ 
    'Person' => [ 
     'type' => 'array', 
     'subfields' => [ 
      'Name' => [ 
       'type' => 'string' 
       ] 
     ] 
    ] 
] 

任何幫助將不勝感激。

編輯

由於這是不明確的。我正在尋找如何使父鍵適用於子值,而不管該值是否爲單個值,或者如果它是多個值的數組。關鍵父級需要應用於所有子級,除非有另一個父級密鑰(理論上可能有無限數量的父級密鑰下的子級/父級密鑰。

最終

我設法想出解決辦法。感謝大家的幫助。

+0

我沒有得到你的問題,我把所有你已經張貼在頂部的四個陣列,那麼什麼是你期望的輸出呢? –

+0

不確定您是否可以選擇這樣做,但如果結果標準化,未來您和任何人都會更容易。我的意思是,無論有多少人或名字,總是使用第四個例子。 –

+0

不幸的是我不能那樣做。我試圖使其儘可能健壯並考慮到許多不同的可能性。此代碼將用於解碼放入數組中的HTML/XML標記,並且我希望能夠處理拋出它的任何內容。 –

回答

0

如果您只是試圖獲取人員列表,您可以使用array_walk_recursive對數據進行規範化,以便將其作爲任何格式的名稱列表返回到理智狀態。

function normaliseData($peopleData) { 
    $people = []; 
    array_walk_recursive($peopleData, function($item, $key) use(&$people) {  
     $people[] = $item;   
    }); 
    return $people; 
} 
print_r(normaliseData($first)); // Array ([0] => John Smith) 
print_r(normaliseData($second)); // Array ([0] => John Smith [1] => John Denver) 
print_r(normaliseData($third)); // Array ([0] => John Smith [1] => Jane Doe) 
print_r(normaliseData($fourth)); // Array ([0] => John Smith [1] => John Denver [2] => Jane Doe) 
+0

array_walk_recursive的問題在於我們會在它上面拋出大量不同的數組,它們永遠不會像這樣基本,並且在某些情況下,鍵名將被重用於多多維多級的不同層次陣列。 –

+0

這將處理列出的四個測試用例。如果我們無法預測收到數據的格式,我不知道如何編寫解決方案。它從錯誤的結尾解決問題。理想情況下,數據應通過某種機制歸一化爲預期格式。 – JasonBoss

+0

我相信你的印象是數組總是相同的。我最終尋找的是一種打擊每一個價值的方法,並且知道一個關鍵字何時具有多個價值。所以在例子#4的情況下,它會知道這個人有兩個名字。我們需要將「Name」鍵鏈接到單個非數組值或將名稱鍵應用於該多維數組的每個子值。 –

0

對於這個array_walk_recursive是爲@JasonBoss工作後最好的選擇,但如果想從一個函數做手工,你可以不喜歡這樣。

Try this code snippet here

<?php 
ini_set('display_errors', 1); 

$array1=[ 
    'Person' => [ 
     'Name' => 'John Smith' 
    ] 
]; 
$array2=[ 
    'Person' => [ 
     'Name' => [ 
      0 => 'John Smith', 
      1 => 'John Denver' 
     ] 
    ] 
]; 
$array3=[ 
    'Person' => [ 
     0 => [ 
      'Name' => 'John Smith' 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
]; 
$array4=[ 
    'Person' => [ 
     0 => [ 
      'Name' => [ 
       0 => 'John Smith', 
       1 => 'John Denver' 
      ] 
     ], 
     1 => [ 
      'Name' => 'Jane Doe' 
     ] 
    ] 
]; 

$result=array(); 
getRecords($array1); 
print_r($result); 

$result=array(); 
getRecords($array2); 
print_r($result); 

$result=array(); 
getRecords($array3); 
print_r($result); 

$result=array(); 
getRecords($array4); 
print_r($result); 


function getRecords($array) 
{ 
    global $result; 
    foreach($array as $key => $value) 
    { 
     if(is_string($value)) 
     { 
      $result["names"][]=$value; 
     } 
     elseif(is_array($array[$key]) && count($array[$key])) 
     { 
      getRecords($value); 
     } 
    } 
} 
+0

不幸的是,在這種情況下,它不能處理其他情況,例如某些東西不是字符串。 is_string函數可以被!is_array函數替換,並且它的工作方式類似嗎? –

+0

我回去看了看,很不幸,代碼無法按預期工作。我們的目標不是收集人員的姓名,而只是將數組遍歷到每個值,並返回與呈現的數組完全相同的數組。 這是我所做的改變,我認爲會起作用,但正如你可以看到的,例如在Array#4上有一些奇怪的行爲。 https://eval.in/785854 –