2017-03-10 12 views
0

PHP DOM XPathXMLを読むために使用しています。 XMLは、私が他の配列ではなく、最初のレコードモバイルの値私はこの配列を使用して、XMLやストアから値を読み取るPHPのXPathで同じノード名を区別する

array(
     'name', 
     'mobile', 
     'address' 
    ); 

ような配列を持っている私は

<details> 
    <name>name1</name> 
    <address>address1</address> 
</details> 
<details> 
    <name>name2</name> 
    <mobile>mobileNum</mobile> 
    <address>address2</address> 
</details> 

を捕まってしまった次のような構造をしています番号が存在しないので、第2レコードからモバイル番号を読み取り、第1レコードに挿入します。

予想される出力は

array 
(

    [0] => array(

       'person_name' = name1, 
       'address' = address1 
       ) 
    [1] => array(

       'person_name' = name1, 
       'mobile_no' = mobileNum 
       'address' = address1 
       ) 
) 

あるしかし、私は、同じ名前を持つ2つのノード間の値を区別することができますどのように

array 
(

    [0] => array(

       'person_name' = name1, 
       'mobile_no' = mobileNum 
       'address' = address1 
       ) 
    [1] => array(

       'person_name' = name1, 
       'address' = address1 
       ) 
) 

として出力を取得します。 XMLを読むため

コードは

$nodes = array 
(
    'person_name' => 'name', 
    'mobile_no' => 'mobile', 
    'address'  => 'address' 
) 

$final_data = array(); 

$node_values = ''; 

foreach($nodes as $key => $data) 
{ 
    $node_values = $xml->xpath('//details'.$data); 

    $node_values = json_decode(json_encode((array)$node_values), TRUE); 

    if(!empty($node_values))  
    { 
     $i = 0; 

     foreach($node_values as $d) 
     { 
      $final_data[$i][$key] = trim($d[0]); 

      $i++; 
     } 
    } 
} 
+1

私たちにあなたの__code__を教えてください。 –

+1

このようなアプローチは間違っています。詳細は –

+0

を繰り返してください。他の方法でデータを取得することができます。 – hrishi

答えて

1

ここにそれがどのように動作するかを説明するコメントが働い例ですされています

https://3v4l.org/ICO5i

<?php 

// First of all, I've added <root> element to your XML document, 
// because otherwise it's invalid. 
// But it's not important for the rest of the code. 
// 
// Also I've added additional <somethingelse> tag to show that filtering is working 
$xmlString = '<root><details> 
    <name>name1</name> 
    <address>address1</address> 
</details> 
<details> 
    <name>name2</name> 
    <mobile>mobileNum</mobile> 
    <address>address2</address> 
    <somethingelse>This will be filtered</somethingelse> 
</details></root>'; 


$xml = new SimpleXMLElement($xmlString); 
//array_flip to get node names as keys for later foreach loop 
$nodes = array_flip(array 
(
    'person_name' => 'name', 
    'mobile_no' => 'mobile', 
    'address'  => 'address', 
)); 

$final_data = array(); 

//Here are all <details> sections' data in array. 
$node_values = $xml->xpath('//details'); 
$node_values = json_decode(json_encode((array)$node_values), TRUE); 

//this loop filters XML data from keys not existing in $nodes, 
// which are the only that you want to keep 
foreach($node_values as $node) { 
    $final_data[] = array_intersect_key($node, $nodes); 
} 

var_dump($final_data); 

私はあなたがそのXMLデータをフィルタリングすることを、仮定しましたそれは$nodes配列に記載されていません。それ以外の場合、必要以上のデータがない場合は、foreachループをスキップして$node_valuesを最終データとして使用できます。

+0

Jakub Matczak:ありがとう。それはうまく動作しますが、接頭辞がある場合は空白の出力が得られます。 – hrishi

関連する問題