【问题标题】:Can´t add values to an array after array_shift在 array_shift 之后无法向数组添加值
【发布时间】:2019-02-05 22:09:22
【问题描述】:

我使用以下代码向关联数组添加值:

$tokenarray += [$datetime => $newtoken];

这很好用。但是在我对数组进行排序并使用该代码对其进行移动之后:

$sortedarray = krsort($tokenarray, 1);
$shiftedarray = array_shift($sortedarray);
$shiftedarray += [$datetime => $newtoken];
$tokenarrayjson = json_encode($shiftedarray);

出现这个错误:

Fatal error: Uncaught Error: Unsupported operand types in SITE Stack trace: #0 {main} thrown in SITE on line

$shiftedarray += [$datetime => $newtoken]; <- This line throes the error

谁能告诉我为什么? array_shift 是否从我的数组中创建一个对象,如果是,我该如何防止它?

问候,安德烈亚斯

【问题讨论】:

    标签: php


    【解决方案1】:

    krsort 不返回排序后的数组,它就地对其参数进行排序并根据是否成功返回真/假。这同样适用于array_shift,它返回从数组中移出的值,而不是移位后的数组:您需要这样做:

    $sortedarray = $tokenarray;
    krsort($sortedarray, SORT_NUMERIC);
    $shiftedarray = $sortedarray;
    array_shift($shiftedarray);
    $shiftedarray += [$datetime => $newtoken];
    $tokenarrayjson = json_encode($shiftedarray);
    

    如果您实际上不需要中间数组,您可以将其简化为:

    krsort($tokenarray, SORT_NUMERIC);
    array_shift($tokenarray);
    $tokenarray += [$datetime => $newtoken];
    $tokenarrayjson = json_encode($tokenarray);
    

    注意

    由于您的键是数字字符串,array_shift 会将它们解释为数字并从 0 开始对您的数组重新编号。为避免这种情况,请在数组的第一个键上使用 unset(使用 key 找到)代替:

    krsort($tokenarray, SORT_NUMERIC);
    unset($tokenarray[key($tokenarray)]);
    $tokenarray += [$datetime => $newtoken];
    $tokenarrayjson = json_encode($tokenarray);
    

    另外请注意,您应该使用 SORT_NUMERIC 而不是 1,以防万一在 PHP 的未来版本中该值发生变化。

    Demo on 3v4l.org

    【讨论】:

    • 尼克,很抱歉打扰你,但你能告诉我是否有办法在浏览器控制台中回显 php 变量吗?我使用 javascript ajaxs,所以当我测试它时,我看不到 php 文件中发生了什么。
    • @Andreasschnetzer 当我想要这样做时,我通常会在我从我的 ajax 调用返回的 JSON 中包含一个额外的字段(例如'status' =&gt; 'here is a message'),然后在我的 JS 中我使用类似if ('status' in result) alert(result.status);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2021-10-30
    • 1970-01-01
    • 2018-03-26
    • 2023-01-17
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多