Как сохранить значение foreach в подмассив и преобразовать его в JSON

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

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 для вызова своих элементов и сохранения их в массиве и.

Почему в = два раза больше $sub_array["firstname"] = $node -> nodeValue = "";?

Ayaz Ali Shah 14.11.2018 06:39

Привет. Я не знаком с субмассивом, я только новичок. и я хочу знать, как правильно использовать подмассивы

unknown 14.11.2018 06:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
62
5

Ответы 5

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

$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;           
            }
        }
    }

Ничего не случилось

unknown 14.11.2018 07:31
$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;           
    }
}

Не могли бы вы добавить пояснения к своему коду для OP и будущих читателей?

The fourth bird 14.11.2018 09:32

Привет, я хочу преобразовать свой XML в JSON с помощью PHP. И я использую foreach для вызова своих элементов и сохранения их в массиве

unknown 15.11.2018 04:47

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

     $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++;       
           }
        }
      }
     }

возможно, это хорошо для var_dump () сначала $ node, если он есть. а затем вы можете поймать его по условию

j3thamz 15.11.2018 07:18

$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.

Я наконец решаю это. этим способом.

$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);

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

Другие вопросы по теме