在不破坏结构的情况下清洁阵列


Cleaning Array without destroying structure

我想在不破坏结构的情况下清理数组。所以我想删除每个元素的值。问题是,数组有更多的维度。

[array]
   [id] = "llll"
   [innerArray]
      [name] = "namenamename"
   [name] = "kdkdfk"
   [arryme]
      [id] = 121212
      [arraytarra] = "dd"

应该是

[array]
   [id] = ""
   [innerArray]
      [name] = ""
   [name] = ""
   [arryme]
      [id] = 0
      [arraytarra] = ""

这是我的开始:

private function cleanArray($array) {
    $return = $array;
    foreach($array as $key => $value) {
        if(is_Array($array[$key])) $this->cleanArray($array[$key]);
        else $return[$key] = "";
    }
}

最终版本,感谢bwoebi:

 /****************
 * cleanArray()
 ****************
 *   cleans an array: deletes the values but let the keys
 */
private function cleanArray($array) {
    foreach($array as &$value) {
        if(is_Array($value)) $value = $this->cleanArray($value);
        else if(is_Int($value)) $value = 0;
        else if(is_Bool($value)) $value = false;
        else $value = "";
    }
    return $array;
}
private function cleanArray($array) {
    foreach($array as &$value) {
        if(is_Array($value))
            $value = $this->cleanArray($value);
        else
            $value = "";
    }
    return $array;
}

您的开始几乎做到了(只需要小的修改(,但您不必复制数组。由于参数列表中没有引用运算符,因此数组将按值传递。

您也可以在foreach循环中通过引用简单地使用数组值。别忘了:将返回的数组保存到一个变量中。并返回您的最终数组。您不会返回任何内容,因为它的名称为$return

我认为答案应该是一个递归函数,它将每个值设置为null或一个null字符串。这里有一个递归函数的例子,它可以做一些不同的事情,但应该是一个不错的起点。

http://tecbrat.blogspot.com/2013/03/recursive-function-to-find-substrings.html

我认为您可以在数组内部循环,并在迭代的同时创建一个新数组,将密钥和值更新为NULL

$new_array = array();
foreach($array as $key => $data)
{
    $new_array[$key] = NULL;
    if(is_array($data))
    {
        foreach($data as $keys => $val)
        {
            $new_array[$key][$keys] = NULL;
        }
    }
}
var_dump($new_array);

这将输出

array (size=4)
  'id' => null
  'innerArray' => 
    array (size=1)
      'name' => null
  'name' => null
  'arryme' => 
    array (size=2)
      'id' => null
      'arraytarra' => null

实时演示

这是我的代码。就性能而言,它不是最佳的,但作为代码艺术,它看起来很棒。

function cleanArray($a) 
{
    return is_array($a) ? array_map("cleanArray", $a) : "";
}
$b = array_map("cleanArray", $array);