将空数组转换为字符串的PHP方法

4
我有一个函数xml2array,它将我的XML文件解析为数组。现在,当我在XML文件中有一个空值时,该函数会将其转换为array()一个空数组。
所以变成[test]=>array(),但是我希望它成为空字符串""。
有人知道如何编辑下面的函数吗:
<?php
    function xml2array($contents, $get_attributes = 1, $priority = 'tag') {

    $parser = xml_parser_create('');
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);
    if (!$xml_values)
        return; //Hmm...
    $xml_array = array ();
    $parents = array ();
    $opened_tags = array ();
    $arr = array ();
    $current = & $xml_array;
    $repeated_tag_index = array (); 
    foreach ($xml_values as $data)
    {
        unset ($attributes, $value);
        extract($data);
        $result = array ();
        $attributes_data = array ();
        if (isset ($value))
        {
            if ($priority == 'tag')
                $result = $value;
            else
                $result['value'] = $value;
        }
        if (isset ($attributes) and $get_attributes)
        {
            foreach ($attributes as $attr => $val)
            {
                if($attr == 'xsi:type') continue;
                if($attr == 'xsi:nil') continue;

                if ($priority == 'tag')
                    $attributes_data[$attr] = $val;
                else
                    $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
            }
        }
        if ($type == "open")
        { 
            $parent[$level -1] = & $current;
            if (!is_array($current) or (!in_array($tag, array_keys($current))))
            {
                $current[$tag] = $result;
                if ($attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                $current = & $current[$tag];
            }
            else
            {
                if (isset ($current[$tag][0]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                { 
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    ); 
                    $repeated_tag_index[$tag . '_' . $level] = 2;
                    if (isset ($current[$tag . '_attr']))
                    {
                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                        unset ($current[$tag . '_attr']);
                    }
                }
                $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
                $current = & $current[$tag][$last_item_index];
            }
        }
        elseif ($type == "complete")
        {
            if (!isset ($current[$tag]))
            {
                $current[$tag] = $result;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
            }
            else
            {
                if (isset ($current[$tag][0]) and is_array($current[$tag]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    if ($priority == 'tag' and $get_attributes and $attributes_data)
                    {
                        $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    ); 
                    $repeated_tag_index[$tag . '_' . $level] = 1;
                    if ($priority == 'tag' and $get_attributes)
                    {
                        if (isset ($current[$tag . '_attr']))
                        { 
                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                            unset ($current[$tag . '_attr']);
                        }
                        if ($attributes_data)
                        {
                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
                }
            }
        }
        elseif ($type == 'close')
        {
            $current = & $parent[$level -1];
        }
    }

    return ($xml_array);
}

?>


1
http://stackoverflow.com/questions/10471387/how-to-convert-an-empty-array-and-empty-object-to-an-empty-string-or-null - Kunal Shah
1
empty($value) ? '' : $value; 这个代码片段让我想起了 simpleXML - Elias Van Ootegem
4个回答

1

只需使用empty检查您的源数组:http://php.net/empty,并在empty()返回true时返回""。在函数开头添加以下内容:

if( empty($myArray) ) {
   return '';
}

0
使用empty函数来检查数组是否为空。
返回 empty($xml_array) ? "" : $xml_array;

<code>$parser = xml_parser_create('');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, trim($contents), $xml_values);
xml_parser_free($parser);
if (!$xml_values)
    return; //Hmm...
$xml_array = array ();
$parents = array ();
$opened_tags = array ();
$arr = array ();
$current = & $xml_array;
$repeated_tag_index = array (); 
foreach ($xml_values as $data)
{
    unset ($attributes, $value);
    extract($data);
    $result = array ();
    $attributes_data = array ();
    if (isset ($value))
    {
        if ($priority == 'tag')
            $result = $value;
        else
            $result['value'] = $value;
    }
    if (isset ($attributes) and $get_attributes)
    {
        foreach ($attributes as $attr => $val)
        {
            if($attr == 'xsi:type') continue;
            if($attr == 'xsi:nil') continue;

            if ($priority == 'tag')
                $attributes_data[$attr] = $val;
            else
                $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
        }
    }
    if ($type == "open")
    { 
        $parent[$level -1] = & $current;
        if (!is_array($current) or (!in_array($tag, array_keys($current))))
        {
            $current[$tag] = $result;
            if ($attributes_data)
                $current[$tag . '_attr'] = $attributes_data;
            $repeated_tag_index[$tag . '_' . $level] = 1;
            $current = & $current[$tag];
        }
        else
        {
            if (isset ($current[$tag][0]))
            {
                $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                $repeated_tag_index[$tag . '_' . $level]++;
            }
            else
            { 
                $current[$tag] = array (
                    $current[$tag],
                    $result
                ); 
                $repeated_tag_index[$tag . '_' . $level] = 2;
                if (isset ($current[$tag . '_attr']))
                {
                    $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                    unset ($current[$tag . '_attr']);
                }
            }
            $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
            $current = & $current[$tag][$last_item_index];
        }
    }
    elseif ($type == "complete")
    {
        if (!isset ($current[$tag]))
        {
            $current[$tag] = $result;
            $repeated_tag_index[$tag . '_' . $level] = 1;
            if ($priority == 'tag' and $attributes_data)
                $current[$tag . '_attr'] = $attributes_data;
        }
        else
        {
            if (isset ($current[$tag][0]) and is_array($current[$tag]))
            {
                $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                if ($priority == 'tag' and $get_attributes and $attributes_data)
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                }
                $repeated_tag_index[$tag . '_' . $level]++;
            }
            else
            {
                $current[$tag] = array (
                    $current[$tag],
                    $result
                ); 
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $get_attributes)
                {
                    if (isset ($current[$tag . '_attr']))
                    { 
                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                        unset ($current[$tag . '_attr']);
                    }
                    if ($attributes_data)
                    {
                        $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                    }
                }
                $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
            }
        }
    }
    elseif ($type == 'close')
    {
        $current = & $parent[$level -1];
    }
}

return ($xml_array);
</code>

} ?>


0

我最初认为array_walk_recursive是一个很好的选择,但它在函数调用中忽略了空数组。

我会创建一个函数,类似于这样。它递归地遍历数组并将数组替换为字符串。(类似于这样)

function replaceArrayToString($arr = array()) {
    $newArr = array();
    foreach($arr as $key=>$value)
    {
        if (is_array($value))
        {
           unset($arr[$key]);

            //Is it an empty array, make it a string
            if (empty($value)) {
                $newArr[$key] = '';
            }
            else {
                $newArr[$key] = replaceArrayToString($value);
            }

        }
        else {
            $newArr[$key] = $value; 
        }

    }
    return $newArr;

}

然后在您现有的函数xml2array()返回数组之前从其末尾调用它。

    elseif ($type == 'close')
        {
        $current = & $parent[$level -1];
        }
    }

    $xml_array = replaceArrayToString($xml_array);
    return ($xml_array);
}

0
你看到的空数组是你设置的默认值:
$result = array ();

您有以下选择:

  1. 保留为空 - 空元素将具有空数组作为值。
  2. 设置为 ""(空字符串)- 空元素将具有空字符串作为值。
  3. 设置为 NULL - 如果具有相同元素名称的兄弟元素,则将删除空元素。单个空元素将被保留。

根据您的需要,只需选择默认选项即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接