Re: TaxonomySearchRequest using PHP


This is for those of you using PHP and interested in using the NBN Web services.

For some time now I have been playing around with the TaxonomySearchRequest query

$response = $client->call('GetSpeciesList', $query );

My first attempt was very crude and was based on unravelling

$Taxons = $response['Taxon'];

- it kind of worked but had too many errors (e.g. TVKs mixed up)

My next version was basically to flatten the response based on a version of the 'array_to_str' code I found on the web (http://www.nio.uos.de/doku/phpdoku/LIB/Utils.html). It was neater and basically the array was flattened as follows:

foreach($array as $key=>$val)
  $str_of_array_keys_n_vals .= "[$key = {". array_to_str($val)."}] , ";
  $str_of_array_keys_n_vals .= "[$key=$val] , ";
$TaxonDetailString = substr($str_of_array_keys_n_vals, 0, strlen($str_of_array_keys_n_vals)-3);

Unfortunately I did not figure out how to deal with Synoym and LowerTaxa as they appeared as separate species. I also wanted to have greater control e.g. to identify 'badly formed'

My current version is a complete rewrite - has fewer lines, has more control and extracts a lot more information. My code still basically flattens the array returned by the query using the following code (you are free to use it):

$ztring = html_entity_decode($client->response);//this is the important step!!!!
settype($ztring, "string");
$ztring_array = explode("<", $ztring);
for ($z=4; $z<count($ztring_array); $z++){
$new_ztring = str_replace("nbntq:", "", $ztring_array[$z]);
$new_ztring = str_replace(">", "", $new_ztring);
//now have tidy strings
   $s=1; //switch on Synonym list
   $s=0; //switch off Synonym list
   $l=1; //switch on LowerTaxa list
   $l=0; //switch off LowerTaxa list
if(strpos($new_ztring,"Taxon taxonVersionKey")===0){
if($s==0 && $l==0 && $t==0){

//now have unique identifiers for all the elements and switches for Synonym and LowerTaxa
if ($t==0){
$tvk_array = explode('"',$new_ztring);
$species_TVKs[$sp] = $species_TVKs[$sp].",".$tvk_array[1];

//If badly formed
if ($t==1){
  if (preg_match('/wellFormed="false"/', $new_ztring)){
$bf_TVK = substr($species_TVKs[$sp], -16);
$species_bf_TVKs[$sp] = $species_bf_TVKs[$sp].",".$bf_TVK;
  $species_TVKs[$sp] = substr($species_TVKs[$sp], 0, -17);
  $bf = 1; //Set the $bf switch
  $bf = 0;

if ($tvk==1){
    if ($t==1){
    $scientific_name_array = explode('"',$new_ztring);
    $Scientific_Name[$sp] = $scientific_name_array[6];
    if ($t==3){
    $scientific_authority_array = explode("Authority",$new_ztring);
    $Scientific_Authority[$sp] = $scientific_authority_array[1];
  if ($t==5){
  $category_array = explode("TaxonReportingCategory",$new_ztring);
  $category[$sp] = $category_array[1];
}elseif ($bf==0){
    if ($t==1){
    $names_array = explode('"',$new_ztring);
      if ($names_array[3]=="false"){ 
      $species_common_names[$sp] = $species_common_names[$sp].", ".$names_array[6];
      $species_names[$sp] = $species_names[$sp].", ".$names_array[6];
    if ($t==3){
    $authority_array = explode("Authority",$new_ztring);
      $authority = $authority_array[1];
      if(is_string($authority)&&!$species_names[$sp]==""){ //problem with non-printing characters
      $species_names[$sp] = $species_names[$sp]."[".$authority."]";

It doesn't look much but it took me quite a while to figure out. I am still testing (http://www.nesbrec.org/thesaurus2.php) but it seems to be working a lot better. If anyone has suggestions for improvements or needs help, let me know



(ePlanning Project Manager) Aberdeenshire Council