2009-08-03 145 views
3

嘿,我有一個巨大的數組回來作爲搜索結果,我要做到以下幾點:PHP數組解析

整個數組,然後用相同的「spubid」添加下列鍵每條記錄行走/在這種情況下vals:「sfirst,smi,slast」到父數組成員$ a [0]。所以結果會保留$ a [0],但增加它,來自sfirst,smi的值和數組中的其他成員的值(因爲它們都具有相同的「spubid」)。我認爲將關鍵值(1,2,3)添加到關聯關鍵字(sfirst1 =>「J.」,smi1 =>「F。」,slast1 =>「Kennedy」)會很好。然後,我想用該「spubid」刪除(unset())數組中其餘的成員。這裏是陣列我得到回來,在這個例子中的所有記錄具有相同的「spubid」的一個簡單的例子:

Array ( 
    [0] => 
    Array ( 
     [spubid] => A00502 
     [sfirst] => J. 
     [smi] => A. 
     [slast] => Doe 
    [1] => 
    Array ( 
     [spubid] => A00502 
     [sfirst] => J. 
     [smi] => F. 
     [slast] => Kennedy 
    [2] => 
    Array ( 
     [spubid] => A00502 
     [sfirst] => B. 
     [smi] => F. 
     [slast] => James 
    [3] => 
    Array ( 
     [spubid] => A00502 
     [sfirst] => S. 
     [smi] => M. 
     [slast] => Williamson 
    ) 
    ) 

所以在本質上我要保持$ A [0],但添加新鍵=>值(sfirst $ key,smi $ key,slast $ key),並從所有具有相同「spubid」的成員中追加「sfirst,smi,slast」的值,然後取消設置$ a [1] - [3]。

只是爲了澄清我的理想最終結果將是:

Array ( 
    [0] => 
    Array ( 
     [spubid] => A00502 
     [sfirst] => J. 
     [smi] => A. 
     [slast] => Doe 
     [sfirst1] => J. 
     [smi1] => F. 
     [slast1] => Kennedy 
     [sfirst2] => B. 
     [smi2] => F. 
     [slast2] => James 
     [sfirst3] => S. 
     [smi3] => M. 
     [slast3] => Williamson 
    ) 
) 

在大多數情況下,我將有一個更大的陣列開始與包括「spubid」的衆多,但出版物的99%的不止一個作者,所以這個例程對於清理結果和使顯示的解析過程更容易很有用。

*** UPDATE

我認爲在我的簡化例子,我可能已經使事情不清楚。我喜歡Chacha102和Zombat的反應,但是我的「父數組」包含的不僅僅是pubid,而且恰好是主鍵。我需要保留大量的從記錄的其他數據,這方面的一個小部分如下:

[spubid] => A00680 
[bactive] => t 
[bbatch_import] => t 
[bincomplete] => t 
[scitation_vis] => I,X 
[dentered] => 2009-08-03 12:34:14.82103 
[sentered_by] => pubs_batchadd.php 
[drev] => 2009-08-03 12:34:14.82103 
[srev_by] => pubs_batchadd.php 
[bpeer_reviewed] => t 
[sarticle] => A case study of bora-driven flow and density changes on the Adriatic shelf (January 1987) 
. 
. 
. 
. 
. 

大概有40列是回來與每個搜索查詢。這些例子並非像pubid那樣對它們進行硬編碼,而是如何在包含它們的同時仍然按照您的建議進行更改。作爲多維的一部分,創建一個多維數組是非常好的,謝謝你的建議。

**** UPDATE:

這裏是我看中了一個解決方案,很簡單的,並得到很好地完成任務。我最終創建了一個多維數組,以便作者在那裏被打破。

在簡化的解決方案:

$apubs_final = array(); 
$spubid = NULL; 
$ipub = 0; 

foreach($apubs as $arec) 
{ 
    if($spubid != $arec['spubid']) 
    { 
    $ipub++; 
    $apubs_final[$ipub] = $arec; 
    // insert UNSET statements here for author data 
    $iauthor = 0; 
    $spubid = $arec['spubid']; 
    } 
    $iauthor++; 
    $apubs_final[$ipub]['authors'][$iauthor]['sauthor_first'] = $arec['sfirst']; 
} 

感謝大家誰回答,你的幫助是/是非常感謝!

+1

這就是一個很高的順序。 – 2009-08-03 22:29:09

+0

可能更容易得到一個作者數組數組,每個數組都包含sfirst,smi和slast? – 2009-08-03 22:32:52

+0

在那裏,我爲你做了兩種方式的回答,因爲你願意轉換爲不同的格式。 – 2009-08-03 22:49:19

回答

3
// First, probably the more parsable way. 
foreach($array as $key => $values) 
{ 
    $end[$spuid] = $values; 
    $spuid = $values['spuid'] 
    $end[$spuid]['authors'][] = array('sfirst' => $values['sfirst'], 
          'smi' => $values['smi'], 
          'slast' => $values['slast']); 

} 

這將讓這樣的

Array(
    [A00502] => 
     Array(
      [supid] => A00502 
       .... other values ..... 
      [authors] => 
       Array(
       [0]=> 
         Array(
        ['sfirst'] => '', 
        ['smi'] => '', 
        ['slast'] => '') 
       ) 
     ) 
) 

,我覺得這種方式更加語法分析,如果你計劃顯示在頁面上,因爲它使用數組,所以你可以的foreach數組作者,這是我見過很多人爲此類屬性做的。

如果你真的想你的理想格式,使用這種事後

$count = 0; 
foreach ($end as $supid => $values) 
{ 
    $other_end[$count] = $values; 
    $other_end[$count]['spuid'] = $spuid; 
    foreach($values['authors'] as $key => $author) 
    { 
     if($key == 0) 
     { 
      $suffix = ''; 
     } 
     else 
     { 
      $suffix = $key; 
     } 
     $other_end[$count]['sfirst'.$suffix] = $author['sfirst']; 
     $other_end[$count]['smi'.$suffix] = $author['smi']; 
     $other_end[$count]['slast'.$suffix] = $author['slast']; 
    } 

} 
2

爲什麼不反而讓鍵入的spubid數組:

// assuming $array is your array: 

$storage = array(); 
foreach($array as $entry) { 
    $bid = $entry['spubid']; 
    if (!isset($storage[$bid])) { 
    // duplicate entry - taking the author out of it. 
    $stortmp = $entry; 
    unset($stortmp['sfirst'], $stortmp['smi'], $stortmp['slast']); 
    // add an authors array 
    $stortmp['authors'] = array(); 
    $storage[$bid] = $stortmp; 
    } 
    $author = array(
    'sfirst' => $entry['sfirst'], 
    'smi' => $entry['smi'], 
    'slast' => $entry['slast']); 
    $storage[$bid]['authors'][] = $author; 
} 

現在你的$存儲陣列應該是這樣的:

Array(
    "A00502" => Array(
    "spubid" => "A00502", 
    "authors" => Array(
     [0] => 
     Array ( 
      [sfirst] => J. 
      [smi] => A. 
      [slast] => Doe 
     [1] => 
     Array ( 
      [sfirst] => J. 
      [smi] => F. 
      [slast] => Kennedy 

你可以很容易地做一個對作者的foreach打印它們:

foreach ($storage as $pub) { 
    echo 'Pub ID: '.$pub['spubid']."<br/>"; 
    foreach ($pub['authors'] as $author) { 
    echo 'Author: '.$author['sfirst'].' '.$author['smi'].' '.$author['slast']."<br/>"; 
    } 
} 

作爲額外的獎勵,您可以訪問$storage['A00502']

更新的COMMENT

看來你的數組可能是由某種SQL查詢涉及從出版物表中加入一個authors表來。這使得你的結果數據集重複了很多它並不需要的信息。沒有理由將所有發佈數據從數據庫中多次傳輸/檢索。請嘗試重寫它得到的所有圖書的查詢其將顯示,然後有一個「作家」查詢確實是這樣的:

SELECT * FROM authors WHERE spubid IN ('A00502', 'A00503', 'A00504'); 

它然後轉換成這個數組用於您的顯示。您的數據庫流量級別將感謝您。

1

此代碼應完全按照您指定的方式工作。我採用了使用幾個臨時陣列來完成主陣列鍵和spubid子鍵之間的相關性的方法。

/* assume $array is the main array */ 
$array = array(
    array('spubid' => 'A00502','sfirst'=>'J.','smi'=>'A.','slast'=>'Doe'), 
    array('spubid' => 'A00502','sfirst'=>'J.','smi'=>'F.','slast'=>'Kennedy'), 
    array('spubid' => 'A00502','sfirst'=>'B.','smi'=>'F.','slast'=>'James'), 
    array('spubid' => 'BXXXXX','sfirst'=>'B.','smi'=>'F.','slast'=>'James'), 
    array('spubid' => 'A00502','sfirst'=>'S.','smi'=>'M.','slast'=>'Williamson') 
); 

//track spubid positions in the main array 
$keyPositions = array(); 
//keys to delete after array iteration 
$keyDel = array(); 
//track how many spubkey increments you've made to the fields 
$spubKeys = array(); 
//fields to copy between spubids 
$copyFields = array('sfirst','smi','slast'); 

foreach($array as $key => $subarr) 
{ 
    if (isset($subarr['spubid'])) { 
     if (isset($keyPositions[$subarr['spubid']])) { 
      //spubid already exists at a main array key, do the copy 
      $spubKey = ++$spubKeys[$subarr['spubid']]; 
      foreach($copyFields as $f) { 
       $array[$keyPositions[$subarr['spubid']]][$f.$spubKey] = $subarr[$f]; 
      } 
      $keyDel[] = $key; 
     } 
     else { 
      //First time encountering this spubid, mark the position 
      $keyPositions[$subarr['spubid']] = $key; 
      $spubKeys[$subarr['spubid']] = 0; 
     } 
    } 
} 
if (count($keyDel)) { 
    foreach($keyDel as $idx) unset($array[$idx]); 
} 

var_dump($array);