Как сохранить значение foreach в подмассив и превратить его в JSON - PullRequest
0 голосов
/ 14 ноября 2018

Как я могу сохранить значение foreach int sub array?Мой массив данных [] возвращает нулевое значение.

foreach( $domNode -> childNodes as $node) {
  if ( $node -> hasChildNodes() ) { json2xml( $node ); }
  else {
     if ( $domNode -> hasAttributes() && strlen( $domNode -> nodeValue) ) {
        $domNode -> setAttribute( "nodeValue", $node -> textContent );
        $sub_array = array();
        $sub_array["firstname"] = $node -> nodeValue = "";
        $sub_array["lastname"] = $node -> nodeValue = "";
        $sub_array["email"] = $node -> nodeValue = "";
        $sub_array["username"] = $node -> nodeValue = "";
        $sub_array["is_block"] = $node -> nodeValue = "";

        $data[] = $sub_array;           

       }
   }
}

Как я могу сохранить эти значения в подмассиве?Я хочу преобразовать свои данные XML в кодировку JSON с использованием PHP и поместить их в jQuery Datatables.И я использую foreach для вызова своих элементов и сохранения их в массиве и.

Ответы [ 5 ]

0 голосов
/ 15 ноября 2018

Я наконец-то решил это.таким образом.

$file = @file_get_contents('user.xml', FILE_TEXT);
$xml = new SimpleXMLElement($file);
$output = @$xml->xpath('/accounts/details');

$outputt = array(
  "draw" => intval($_POST["draw"]),
  "data" => $output
);

echo json_encode($outputt);

Спасибо за ваше время и ответы.:)

0 голосов
/ 14 ноября 2018

$sub_array["firstname"] = $node->nodeValue = ""; сначала заменит все содержимое $node пустой строкой, удалив любое содержимое.После этого он присвоит пустую строку $sub_array["firstname"].

И вы присваиваете один и тот же $node->nodeValue всем различным элементам массива.Ваш код выглядит так, как будто это какая-то часть общего преобразования и какая-то конкретная часть задания.Вызов функции json2xml() на узле DOM не имеет для меня особого смысла.

Итак, вот небольшой пример для чтения конкретного XML с помощью DOM.Использование методов DOM возможно, но с Xpath это намного проще:

$xml = <<<'XML'
<persons>
  <person>
    <firstname>Jane</firstname>
    <lastname>Doe</lastname>
  </person>
</persons>
XML;

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

$persons = [];
foreach ($xpath->evaluate('/persons/person') as $personNode) {
    $persons[] = [
        'firstname' => $xpath->evaluate('string(firstname)', $personNode),
        'lastname' => $xpath->evaluate('string(lastname)', $personNode)
    ];
}

var_dump($persons);

Вывод:

array(1) {
  [0]=>
  array(2) { 
    ["firstname"]=>
    string(4) "Jane"
    ["lastname"]=>
    string(3) "Doe" 
  } 
}

Результат DOMXpath::evaluate() зависит от выражения Xpath./persons/person всегда будет возвращать список узлов.Если здесь нет узлов person элемента внутри узла элемента документа persons, он вернет пустой список.

string(firstname) извлечет все firstname дочерние элементы элемента предоставленного контекста ($personNode) и преобразует первый найденный узел в строку.Если здесь нет совпадения, он вернет пустую строку.

Xpath допускает довольно сложное выражение в комбинированных и вложенных условиях.Это позволяет вам избежать большого количества сложностей (циклов) в вашем источнике PHP.

0 голосов
/ 14 ноября 2018
$data = array();

foreach( $domNode -> childNodes as $node) {
    if ( $node -> hasChildNodes() ) {
     json2xml( $node ); }
    elseif ( $domNode -> hasAttributes() && strlen( $domNode -> nodeValue ) ) {
            $domNode -> setAttribute( "nodeValue", $node -> textContent );
            $sub_array = array();
            $sub_array["firstname"] = $node->nodeValue;
            $sub_array["lastname"] = $node->nodeValue;
            $sub_array["email"] = $node->nodeValue;
            $sub_array["username"] = $node->nodeValue;
            $sub_array["is_block"] = $node->nodeValue;

            $data[] = $sub_array;           
    }
}
0 голосов
/ 14 ноября 2018

Попробуйте это, братан.

     $sub_array = array();
     $count = 0;
     if( $domNode->childNodes OR !empty( $domNode->childNodes)){
     foreach( $domNode->childNodes as $node) {
        if ( $node->hasChildNodes() ) { json2xml( $node ); }
        else {
        if ( $domNode->hasAttributes() && strlen( $domNode->nodeValue ) ) {
            $domNode->setAttribute( "nodeValue", $node->textContent );

            $sub_array[$count]["firstname"] = $node->nodeValue;
            $sub_array[$count]["lastname"] = $node->nodeValue;
            $sub_array[$count]["email"] = $node->nodeValue;
            $sub_array[$count]["username"] = $node->nodeValue;
            $sub_array[$count]["is_block"] = $node->nodeValue;

            $count++;       
           }
        }
      }
     }
0 голосов
/ 14 ноября 2018

Я считаю, что проблема в том, что вы = два раза, что мешает сохранить значение в массиве, попробуйте ниже скрипт

$sub_array = array();
$data= array();
    foreach( $domNode -> childNodes as $node) {
        if ( $node -> hasChildNodes() ) { json2xml( $node ); }
        else {
            if ( $domNode -> hasAttributes() && strlen( $domNode -> nodeValue ) ) {
                $domNode -> setAttribute( "nodeValue", $node -> textContent );

                $sub_array["firstname"] = $node->nodeValue;
                $sub_array["lastname"] = $node->nodeValue;
                $sub_array["email"] = $node->nodeValue;
                $sub_array["username"] = $node->nodeValue;
                $sub_array["is_block"] = $node->nodeValue;

                $data[] = $sub_array;           
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...