非法字符串偏移

时间:2018-03-20 17:08:07

标签: php arrays string warnings offset

我已经搜索过并且无法找到答案。

tl; dr我有一个wordpress主题,不再得到创作者的支持,我正试图摆脱一些页面顶部弹出的警告文字。我不是程序员,所以我不知道该怎么做,但我确实理解代码足以修补其他地方的修复程序。我需要帮助。

这是我得到的:

Warning: Illegal string offset 'group_no' in file1.php on line 196
Warning: Illegal string offset 'order_no' in file1.php on line 196
Warning: Illegal string offset 'group_no' in file1.php on line 200

这是file1.php的相关代码:

function get_location( $location, $post_id )
{
    // loaded by PHP already?
    if( !empty($location) )
    {
        return $location;
    }


    // vars
    $groups = array();
    $group_no = 0;


    // get all rules
    $rules = get_post_meta($post_id, 'rule', false);


    if( is_array($rules) )
    {
        foreach( $rules as $rule )
        {
            // if field group was duplicated, it may now be a serialized string!
            $rule = maybe_unserialize($rule);


            // does this rule have a group?
            // + groups were added in 4.0.4
            if( !isset($rule['group_no']) )
            {
                $rule['group_no'] = $group_no;

                // sperate groups?
                if( get_post_meta($post_id, 'allorany', true) == 'any' )
                {
                    $group_no++;
                }
            }


            // add to group
            $groups[ $rule['group_no'] ][ $rule['order_no'] ] = $rule; // this is line 196


            // sort rules
            ksort( $groups[ $rule['group_no'] ] );

        }

        // sort groups
        ksort( $groups ); //this is line 200
    }


    // return fields
    return $groups;
}

我知道这是某种类型的数组赋值错误,但我对php不太熟悉,无法理解错误是什么以及如何解决它。如何在保留功能的同时重建此代码以使错误消失?

2 个答案:

答案 0 :(得分:0)

我不能保证这会修复代码的预期目的,但它应该摆脱非法字符串偏移错误:

<?php
// Lines 0..194
if (true === is_array($groups)
    && true === key_exists('group_no', $rule)
    && true === key_exists('order_no', $rule)
) {
    // original line 196
    $groups[ $rule['group_no'] ][ $rule['order_no'] ] = $rule; 
}

以下是$groups数组时的行为示例:https://eval.in/975271

以下是$groups为字符串时的行为示例:https://eval.in/975273

两者都没有错误输出!

答案 1 :(得分:0)

我不知道是什么让代码准确, 但是在框外思考 ,我认为你可以禁用任何/所有WordPress和PHP警报,因为消息是什么你得到的是简单的警告,代码可以继续执行,尽管没有预期的行为。

您可以尝试在文件启动时添加error_reporting(0)或直接在php.ini中禁用。更多信息:

PD:我知道这个解决方案确实无法解决代码问题,但此时您的目标是消除消息并维护正常的页面方面。