Array_push 推送空值
Array_push pushing empty values
我正在尝试将数据推送到 foreach 循环内的数组。空值被推入数组。
我尝试注销这些值以查看它们是否为空但它们在那里,它们只会在推送到数组时丢失。我还尝试将值分配给另一个变量并且效果很好。
$winners = \App\Winner::where('gameid', 577)->pluck('prizes_web_1');
$xml = simplexml_load_string(stripslashes($winners));
$winners_1 = [];
foreach($xml->Winner as $v) {
$out->writeln($v); //when logging here every value gets logged correctly
array_push($winners_1, $v);
}
$out->writeln($winners_1); //here an array with 4 empty values gets logged
我尝试将数组声明为 array()
,问题仍然存在。尝试像 winners_1[] = $v
这样分配值,但一切都保持不变。也尝试使用 strval($v)
但这也没有帮助
我无法弄清楚是什么导致了这个问题,在推送到数组时我从来没有遇到过类似的事情。
编辑
这是 xml 的示例:
<?xml version='1.0' encoding='UTF-8'?>
<Winners>
<Winner><name>Robb Stark</name></Winner>
<Winner><name>Jon Snow</name></Winner>
<Winner><name>Aria Stark</name></Winner>
<Winner><name>Theon Greyjoy</name></Winner>
</Winners>
$log->writeln()
行也将事情记录到控制台,当记录 $v
时,我可以看到记录的值 Robb Stark
、Jon Snow
等,当它们消失时推送到数组。
编辑 2
为上面的示例代码添加了更多上下文。
编辑 3 解决方案
谢谢@misorude
我只需要转换我的 xml name
元素就可以了。
$winners_1[] = (string)$v->name;
编辑
你只需要像这样定义 winners 数组 $winners_1 = array();不是 $winners_1 = [];//这用于 javascript 我想我是新人。
我测试了这个,它在这里工作正常。
试试这个,
$winners_1 = array();
foreach($xml->Winner as $v) {
$out->writeln($v); //when logging here every value gets logged correctly
$winners_1[] = $v;
}
$out->writeln($winners_1);
这里的问题并不是真正将元素添加到数组中,而是 实际上添加了什么 - 以及稍后如何处理/解释它。
SimpleXML 就是您传统上所说的“善变的情妇”。通常 SimpleXMLElement 实例在某些上下文中表现得像字符串 - 但在稍微不同的上下文中则不然。
我没有去查看 Symfony 的 ConsoleOutput 的内部工作原理,但是它如何从输入对象创建输出可能在这里发挥了作用。
Casper 将它们转换为字符串的建议是个好主意 - 如果您以后不再需要 SimpleXMLElement 对象提供的任何属性/方法,而您只需要它们包含的“数据” - 然后将它们转换为尽快是避免进一步麻烦的好方法。
这里不能直接将 $v 转换为字符串 - 因为 Winner
元素不直接包含文本,而是包含在额外的 name
元素中。将包含其他元素的 SimpleXMLElement 强制转换为字符串只会再次导致空字符串。
因此需要访问 name
元素本身并将其转换为字符串 - (string) $v->name
我认为您正在尝试将 SimpleXMLElements 元素添加到数组中。如果要添加字符串值,则必须将 SimpleXMLElement 转换为字符串。下面我尝试根据上述讨论重现您的问题。
$myXMLData = "<?xml version='1.0' encoding='UTF-8'?>
<Winners>
<Winner><name>Robb Stark</name></Winner>
<Winner><name>Jon Snow</name></Winner>
<Winner><name>Aria Stark</name></Winner>
<Winner><name>Theon Greyjoy</name></Winner>
</Winners>";
基于 PHP 文档 xml 到数组 https://www.php.net/manual/en/book.simplexml.php
$xml = simplexml_load_string($myXMLData);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
然后循环,
$winners_1 = [];
foreach($array['Winner'] as $v) {
array_push($winners_1, $v['name']);
}
print_r($winners_1);
答案:
Array ( [0] => Robb Stark [1] => Jon Snow [2] => Aria Stark [3] => Theon Greyjoy )
我正在尝试将数据推送到 foreach 循环内的数组。空值被推入数组。
我尝试注销这些值以查看它们是否为空但它们在那里,它们只会在推送到数组时丢失。我还尝试将值分配给另一个变量并且效果很好。
$winners = \App\Winner::where('gameid', 577)->pluck('prizes_web_1');
$xml = simplexml_load_string(stripslashes($winners));
$winners_1 = [];
foreach($xml->Winner as $v) {
$out->writeln($v); //when logging here every value gets logged correctly
array_push($winners_1, $v);
}
$out->writeln($winners_1); //here an array with 4 empty values gets logged
我尝试将数组声明为 array()
,问题仍然存在。尝试像 winners_1[] = $v
这样分配值,但一切都保持不变。也尝试使用 strval($v)
但这也没有帮助
我无法弄清楚是什么导致了这个问题,在推送到数组时我从来没有遇到过类似的事情。
编辑 这是 xml 的示例:
<?xml version='1.0' encoding='UTF-8'?>
<Winners>
<Winner><name>Robb Stark</name></Winner>
<Winner><name>Jon Snow</name></Winner>
<Winner><name>Aria Stark</name></Winner>
<Winner><name>Theon Greyjoy</name></Winner>
</Winners>
$log->writeln()
行也将事情记录到控制台,当记录 $v
时,我可以看到记录的值 Robb Stark
、Jon Snow
等,当它们消失时推送到数组。
编辑 2 为上面的示例代码添加了更多上下文。
编辑 3 解决方案
谢谢@misorude
我只需要转换我的 xml name
元素就可以了。
$winners_1[] = (string)$v->name;
编辑 你只需要像这样定义 winners 数组 $winners_1 = array();不是 $winners_1 = [];//这用于 javascript 我想我是新人。
我测试了这个,它在这里工作正常。 试试这个,
$winners_1 = array();
foreach($xml->Winner as $v) {
$out->writeln($v); //when logging here every value gets logged correctly
$winners_1[] = $v;
}
$out->writeln($winners_1);
这里的问题并不是真正将元素添加到数组中,而是 实际上添加了什么 - 以及稍后如何处理/解释它。
SimpleXML 就是您传统上所说的“善变的情妇”。通常 SimpleXMLElement 实例在某些上下文中表现得像字符串 - 但在稍微不同的上下文中则不然。
我没有去查看 Symfony 的 ConsoleOutput 的内部工作原理,但是它如何从输入对象创建输出可能在这里发挥了作用。
Casper 将它们转换为字符串的建议是个好主意 - 如果您以后不再需要 SimpleXMLElement 对象提供的任何属性/方法,而您只需要它们包含的“数据” - 然后将它们转换为尽快是避免进一步麻烦的好方法。
这里不能直接将 $v 转换为字符串 - 因为 Winner
元素不直接包含文本,而是包含在额外的 name
元素中。将包含其他元素的 SimpleXMLElement 强制转换为字符串只会再次导致空字符串。
因此需要访问 name
元素本身并将其转换为字符串 - (string) $v->name
我认为您正在尝试将 SimpleXMLElements 元素添加到数组中。如果要添加字符串值,则必须将 SimpleXMLElement 转换为字符串。下面我尝试根据上述讨论重现您的问题。
$myXMLData = "<?xml version='1.0' encoding='UTF-8'?>
<Winners>
<Winner><name>Robb Stark</name></Winner>
<Winner><name>Jon Snow</name></Winner>
<Winner><name>Aria Stark</name></Winner>
<Winner><name>Theon Greyjoy</name></Winner>
</Winners>";
基于 PHP 文档 xml 到数组 https://www.php.net/manual/en/book.simplexml.php
$xml = simplexml_load_string($myXMLData);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
然后循环,
$winners_1 = [];
foreach($array['Winner'] as $v) {
array_push($winners_1, $v['name']);
}
print_r($winners_1);
答案:
Array ( [0] => Robb Stark [1] => Jon Snow [2] => Aria Stark [3] => Theon Greyjoy )