【问题标题】:Array_push pushing empty valuesArray_push 推送空值
【发布时间】:2019-08-30 09:19:56
【问题描述】:

我正在尝试将数据推送到 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-&gt;writeln() 行也将内容记录到控制台,当记录 $v 时,我可以看到记录的值 Robb StarkJon Snow 等,它们在推送到阵列时消失。

编辑 2 为上面的示例代码添加了更多上下文。

编辑 3 解决方案

谢谢@misorude

我只需要转换我的 xml name 元素就可以了。 $winners_1[] = (string)$v-&gt;name;

【问题讨论】:

  • 请提供xml样本。
  • 以及您的代码对该 XML 的作用的示例,以及您实际希望代码生成的结果的描述和示例
  • 很难说$out-&gt;writeln 代表什么。您可能应该使用var_dump 进行调试并检查输出并更新问题。
  • 健全性检查 没有理由相信 array_push() 只是在找你。然而,有更多的理由假设像$out-&gt;writeln() 这样的未知函数可能会弄乱它被要求输出的数据。请用您/我们可以信任的东西替换它们,例如var_dump()
  • 是的,刚刚意识到这一点。您在此处循环遍历 Winner 元素,但您在这些元素中附加了一个 name - 因此您不能将 Winner SimpleXMLElement 实例直接转换为字符串,但您需要显式转换 name 元素:(string) $v-&gt;name

标签: php arrays array-push


【解决方案1】:

这里的问题并不是真正将元素添加到数组中,而是实际添加了 什么 - 以及稍后如何处理/解释它。

SimpleXML 是您传统上所说的“善变的情妇”。通常 SimpleXMLElement 实例在某些上下文中表现得像字符串 - 但在稍有不同的情况下则不同。

我没有去查看 Symfony 的 ConsoleOutput 的内部工作原理,但它究竟是如何从输入对象创建输出的可能在这里起了作用。

Casper 建议将它们转换为字符串是一个好主意 - 如果您不再需要 SimpleXMLElement 对象稍后提供的任何属性/方法,而您只需要它们包含的“数据” - 然后尽快将它们转换可能是避免进一步麻烦的好方法。

您不能在这里直接将 $v 转换为字符串 - 因为 Winner 元素不直接包含文本,但它被包裹在一个额外的 name 元素中。将包含其他元素的 SimpleXMLElement 转换为字符串只会再次导致空字符串。

所以name元素本身需要在这里被访问并转换成一个字符串——(string) $v-&gt;name

【讨论】:

    【解决方案2】:

    编辑 您只需要像这样定义获胜者数组 $winners_1 = array(); not $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);
    

    【讨论】:

    • $winners_1[] = $v; 会简单得多,但无论哪种方式都不会停止创建带有空格的事件
    【解决方案3】:

    我认为您正在尝试将 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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多