Advertisement
svennd

php gedcom parser

Jan 6th, 2012
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.96 KB | None | 0 0
  1. <?php
  2.  
  3. // gedcom reader
  4. // based on GEDCOM files from Aldfaer
  5. // door : Svenn D'Hert - 06/jan/2012
  6. // http://wwww.svennd.be
  7.  
  8. // het gedcom file (vb : mijnfamilie.ged)
  9. $gedcom_file = "";
  10.  
  11. // check if file exist
  12. if ( file_exists ($gedcom_file) )
  13. {
  14.  // lees het bestand in (als array)
  15.  $gedcom_read = file($gedcom_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  16.  $amount_of_lines = count ($gedcom_read);
  17.  $final_read = array();
  18.  
  19.  $level_0 = 0;
  20.  $level_1 = 0;
  21.  $level_2 = 0;
  22.  $level_3 = 0;
  23.  
  24.  // doorlees de array en maak de lijnen bindend aan hun indent level aangegeven door gedcom
  25.  for ( $i = 0; $i < $amount_of_lines; $i++)
  26.  {
  27.  // indien het niet gaat om lege regels
  28.  // split/expode dan de lijn op basis van spatie
  29.  if ( !empty($gedcom_read[$i]))
  30.  $split_line = clean_split($gedcom_read[$i]);
  31.  
  32.  // nieuwe entititeit (HEAD en TRLR worden niet uitgefilterd)
  33.  if ($split_line['indent'] == 0)
  34.  {
  35.  $level_0++;
  36.  $final_read[$level_0] = array('name' => $split_line['name']);
  37.  }
  38.  // level 1 indent
  39.  else if ($split_line['indent'] == 1)
  40.  {
  41.  $level_1 = $split_line['name'];
  42.  
  43.  // indien de volgende lijn een "kind" (indent++) is
  44.  // gebruik dan een array om de kinderen op te slaan.
  45.  if (is_next_line_child($i, $gedcom_read, 1))
  46.  {
  47.  $final_read[$level_0][$level_1] = ($split_line['value']) ? array($split_line['name'] => $split_line['value']) : array();
  48.  }
  49.  else
  50.  {
  51.  $final_read[$level_0][$level_1] = $split_line['value'];
  52.  }
  53.  }
  54.  // level 2 indent
  55.  else if ($split_line['indent'] == 2)
  56.  {
  57.  $level_2 = $split_line['name'];
  58.  
  59.  if (is_next_line_child($i, $gedcom_read, 2))
  60.  {
  61.  $final_read[$level_0][$level_1][$level_2] = ($split_line['value']) ? array($split_line['name'] => $split_line['value']) : array();
  62.  }
  63.  else
  64.  {
  65.  $final_read[$level_0][$level_1][$level_2] = $split_line['value'];
  66.  }
  67.  }
  68.  // level 3 indent
  69.  else if ($split_line['indent'] == 3)
  70.  {
  71.  $level_3 = $split_line['name'];
  72.  $final_read[$level_0][$level_1][$level_2][$level_3] = ($split_line['value']) ? array($split_line['name'] => $split_line['value']) : array();
  73.  
  74.  if (is_next_line_child($i, $gedcom_read, 3))
  75.  {
  76.  $final_read[$level_0][$level_1][$level_2][$level_3] = array($split_line['name'] => $split_line['value']);
  77.  }
  78.  else
  79.  {
  80.  $final_read[$level_0][$level_1][$level_2][$level_3] = $split_line['value'];
  81.  }
  82.  }
  83.  
  84.  }
  85. }
  86.  
  87. // functie die kijkt of de volgende lijn een hogere indent heeft
  88. // deze functie is optioneel
  89. // u kunt deze "verwijderen" door
  90. // de return lijn te veranderen naar :
  91. // return true;
  92. function is_next_line_child($i, $gedcom_read, $indent)
  93. {
  94.  $line = clean_split($gedcom_read[$i+1]);
  95.  return ($line['indent'] > $indent) ? true : false;
  96. }
  97.  
  98. // splits de lijn in 2/3 delen
  99. // [indent][name][value(opt)]
  100. function clean_split($line)
  101. {
  102.  $line = explode(" ", trim($line), 3);
  103.  
  104. return array(
  105.  'indent' => $line[0],
  106.  'name' => htmlspecialchars($line[1]),
  107.  'value' => ((isset($line[2])) ? $line[2] : false)
  108.  );
  109. }
  110.  
  111. // output
  112. print_r($final_read);
  113. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement