1

我试图让一个函数将数组转换为字符串值,代码是:

function makestring($array)
  {
  $outval = '';
  foreach($array as $key=>$value)
    {
    if(is_array($value))
      {
      $outval .= makestring($value);
      }
    else
      {
      $outval .= $value;
      }
    }
  return $outval;
  }

但我收到此错误:警告:为 foreach() 提供的参数无效。有人可以帮我吗?

4

8 回答 8

1

递归内爆()这将多维数组转换为字符串

function mYimplode($array, $delimeter) {
 $result='';
 foreach ($array as $key) {
    if (is_array($key)) {
        $result .= mYimplode($key, $delimeter) . $delimeter;
    } else {
        $result .= $key . $delimeter;
    }
 }

 $result = substr($result, 0, 0-strlen($delimeter));

 return $result;
}
于 2013-07-04T08:50:45.180 回答
1
function makestring($array)
{
    if(is_array( $array )) {
        $outval = '';
        foreach($array as $key=>$value)
        {
            if(is_array($value))
            {
                $outval .= makestring($value);
            }
            else
            {
                $outval .= $value;
            }
        }
        return $outval;
    } else {
        die("Supplied argument is not an array");
    }
}
OR 
function makestring( array $array)
{
    // you code goes here
}

尝试这个。您需要array在使用之前检查传递参数是否foreach

于 2013-07-04T08:38:14.953 回答
0

为了防止 foreach 出错,最好将 type 设置为 variable:

foreach((array)$someArray as $data) {

即使 $someArray 不是数组,您也不会收到任何错误。

于 2013-07-04T08:39:56.630 回答
0

→ 试试这个:

  function makestring($array)
  {
       $outval = '';
       $keys = array_keys( $array );

       for( $x = 0; $x < count( $array ); $x++ )
       {
            if( is_array( $array[ $keys[ $x ] ] ) )
            {
                 $outval .= makestring( $array[ $keys[ $x ] ] );
            }
            else
            {
                 $outval .= $array[ $keys[ $x ] ];
            }
       }
  return $outval;
  }
于 2013-07-04T08:40:21.290 回答
0

你检查通过

if(is_array($value))
{
  $outval .= makestring($value);
}

是否makestring()递归调用。但是,在makestring()首先输入的代码中,您没有进行此类检查。没关系,但是你必须检查makestring()你是否真的从调用者那里得到了一个数组。这就是所谓的防御性编程。

另一种选择是在调用方进行检查。这是 Design By Contract™ 的一部分:

$var = i_usually_give_you_an_array_but_i_might_also_fail();
if (is_array($var)) {
  echo makestring($value);
}
于 2013-07-04T08:53:19.270 回答
0

也许您使用 $key 和 $value 的变量中有旧数据,通常在 foreach 末尾的 unset($key,$value) 可以解决这个问题

于 2013-07-04T08:46:24.520 回答
0
$array = array(
    '1',
    '2',
    '3',
    array(
        '4',
        '5',
        array(
            '6',
            '7'
        )
    )
);
$output = null;
if(!is_array($array)){
    $array = array($array);
}
// use a reference to the $output in the callback
array_walk_recursive($array, function($array_element) use (&$output){
    if(is_object($array_element) and method_exists($array_element, '__toString')){
        $array_element = strval($array_element);
    }
    if(is_scalar($array_element)){
        $output .= $array_element;
    }else{
        // found a non scalar... handle it! :)
    }
});
echo $output;

看一下这个。

于 2013-07-04T08:47:44.143 回答
0
array_walk_recursive((array) $array, function($val, $key) {
  global $result;
  $result .= $val;
});
于 2013-07-04T08:48:50.587 回答