Как я могу сохранить значение 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 = 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;
}
}
}
Ничего не случилось
$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 и будущих читателей?
Привет, я хочу преобразовать свой XML в JSON с помощью PHP. И я использую foreach для вызова своих элементов и сохранения их в массиве
Попробуй этого, братан.
$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, если он есть. а затем вы можете поймать его по условию
$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);
Спасибо за ваше время и ответы. :)
Почему в
=два раза больше$sub_array["firstname"] = $node -> nodeValue = "";?