将具有分隔值的 XML 项处理到 PHP 数组中
Process XML item with delimited values into PHP array
我正在尝试将一个 XML 项目处理成一个 PHP 数组并简单地 return 它。
但是,我在第 3 行收到 "Array to string conversion" 错误。
PHP代码
function processPlayers($players) { // paramater is the XML item
$playerGUIDS = array();
$playerGUIDArray = explode(";", $players); // CREATE ARRAY FROM STRING WHICH HAVE A ; DELIMINATER
foreach($playerGUIDArray as $player) {
$playerGUIDS[] = $player;
}
return $playerGUIDS;
}
XML 项目
<playguid>DC242003;BY523643</playguid>
我使用 WP ALL Import 作为插件,所以我将我的自定义字段数据值指定为
[processPlayers({playguid[1]})]
看这里:
http://www.wpallimport.com/2015/10/wp-all-export-1-1-1-function-editor/
http://www.wpallimport.com/documentation/advanced/execute-php/
我理想的输出如下(这是 WordPress 数据库中元数据的形式)。
a:2:{i:0;s:8:"JC745819";i:1;s:8:"JB705789";}
您遇到错误,因为 WPAllImport 尝试将此值插入数据库。因此,您必须在函数 string
中使用 return 值,而不是数组。在您的情况下,序列化:
function processPlayers($players) {
return serialize(explode(";", $players));
}
我刚刚遇到一个密切相关的案例,将多个 XML 项解析为一个数组。由于这是该主题中排名最高的搜索结果之一,我认为以下内容可能会对其他人有所帮助:
WP All Import 不会将数组值传递给您的自定义 PHP 函数。如果您的输入元素不是字符串,而是例如XML 个子元素的列表,那么如果您尝试执行以下操作,WP All Import 将传递一个空字符串:
<parents>
<parent>...</parent>
<parent>...</parent>
<parent>...</parent>
...
</parents>
[IF(has_special_children({parents[1]}))]
<h2>My Conditional Header</h2>
{parents[1]/parent[8]}
{parents[1]/parent[12]}
{parents[1]/parent[13]}
[ENDIF]
<?php
function has_special_children($parent) {
var_dump(gettype($parent)); // outputs: string
var_dump($parent); // outputs: string ""
return $parent[8] || $parent[12] || $parent[13];
}
?>
在 PHP 函数中,当传递具有子元素的 XML 元素时,$parent
始终为空字符串。
解决方案
您可以在 PHP 中使用 variadic function 来传递感兴趣的元素并单独检查它们:
[IF(wpai_has_any_value({parents[1]/parent[8]}, {parents[1]/parent[12]}, {parents[1]/parent[13]}))]
<h2>My Conditional Header</h2>
{parents[1]/parent[8]}
{parents[1]/parent[12]}
{parents[1]/parent[13]}
[ENDIF]
<?php
function wpai_has_any_value(...$values) {
return (bool) array_filter($values);
}
?>
我正在尝试将一个 XML 项目处理成一个 PHP 数组并简单地 return 它。
但是,我在第 3 行收到 "Array to string conversion" 错误。
PHP代码
function processPlayers($players) { // paramater is the XML item
$playerGUIDS = array();
$playerGUIDArray = explode(";", $players); // CREATE ARRAY FROM STRING WHICH HAVE A ; DELIMINATER
foreach($playerGUIDArray as $player) {
$playerGUIDS[] = $player;
}
return $playerGUIDS;
}
XML 项目
<playguid>DC242003;BY523643</playguid>
我使用 WP ALL Import 作为插件,所以我将我的自定义字段数据值指定为
[processPlayers({playguid[1]})]
看这里:
http://www.wpallimport.com/2015/10/wp-all-export-1-1-1-function-editor/ http://www.wpallimport.com/documentation/advanced/execute-php/
我理想的输出如下(这是 WordPress 数据库中元数据的形式)。
a:2:{i:0;s:8:"JC745819";i:1;s:8:"JB705789";}
您遇到错误,因为 WPAllImport 尝试将此值插入数据库。因此,您必须在函数 string
中使用 return 值,而不是数组。在您的情况下,序列化:
function processPlayers($players) {
return serialize(explode(";", $players));
}
我刚刚遇到一个密切相关的案例,将多个 XML 项解析为一个数组。由于这是该主题中排名最高的搜索结果之一,我认为以下内容可能会对其他人有所帮助:
WP All Import 不会将数组值传递给您的自定义 PHP 函数。如果您的输入元素不是字符串,而是例如XML 个子元素的列表,那么如果您尝试执行以下操作,WP All Import 将传递一个空字符串:
<parents>
<parent>...</parent>
<parent>...</parent>
<parent>...</parent>
...
</parents>
[IF(has_special_children({parents[1]}))]
<h2>My Conditional Header</h2>
{parents[1]/parent[8]}
{parents[1]/parent[12]}
{parents[1]/parent[13]}
[ENDIF]
<?php
function has_special_children($parent) {
var_dump(gettype($parent)); // outputs: string
var_dump($parent); // outputs: string ""
return $parent[8] || $parent[12] || $parent[13];
}
?>
在 PHP 函数中,当传递具有子元素的 XML 元素时,$parent
始终为空字符串。
解决方案
您可以在 PHP 中使用 variadic function 来传递感兴趣的元素并单独检查它们:
[IF(wpai_has_any_value({parents[1]/parent[8]}, {parents[1]/parent[12]}, {parents[1]/parent[13]}))]
<h2>My Conditional Header</h2>
{parents[1]/parent[8]}
{parents[1]/parent[12]}
{parents[1]/parent[13]}
[ENDIF]
<?php
function wpai_has_any_value(...$values) {
return (bool) array_filter($values);
}
?>