-2

我有一个关联的数组。我希望能够删除其键以任何给定长度的给定字符串开头的所有元素。我还希望能够将所有以给定字符串开头的键重命名为由键的其余部分附加的新字符串。例如,给定初始数组,删除所有以“zzz”开头的元素将导致删除数组,将所有以“zzz”开头的元素重命名为“yyyy”将导致重命名数组。

Initial Array
Array
(
    [zzzaaaa] => 1
    [bbbb] => 1
    [cccc] => 1
    [zzzdddd] => 1
)

Deleted Array
Array
(
    [bbbb] => 1
    [cccc] => 1
)

Renamed Array
Array
(
    [yyyyaaaa] => 1
    [bbbb] => 1
    [cccc] => 1
    [yyyydddd] => 1
)

PS。这样做的目的是存储 URS,因此如果子目录被删除或重命名,对其他目录和文件的所有引用也会被删除或重命名。

编辑。这就是我最终的结果。不知道是否有更快/更少的代码方式。

//Delete
$length=strlen($key_string);
foreach($myArray as $key=>$value) {
    if(substr($key, 0, $length)==$key_string) {unset($myArray[$key]);}
}

//Rename
$length=strlen($key_string);
foreach($myArray as $key=>$value) {
    if(substr($key, 0, $length)==$key_string) {
        $myArray[$new_key_string.substr($key, $length)] = $myArray[$key_string];
        unset($myArray[$key]);
    }
}
4

2 回答 2

1

你可以使用array_walk来做到这一点。但是,在迭代它时我不会操纵数组。最好创建一个新数组来存储结果。

这是我要做的:

    //You input array
    $array=array( "zzzaaaa" => 1, "bbbb" => 1, "cccc" => 1, "zzzdddd" => 1);

    //Array for storing the results
    $new_array=array();

    //print original array
    print_r($array);

    //walk over array and determine if it starts with zzz
    array_walk($array, function($val, $key) use(&$array, &$new_array){
        if(strpos($key, "zzz")===0){
            $new_array[preg_replace("/zzz/","yyyy", $key)]=$val;
        }else{
            $new_array[$key]=$val;
        }
    });
    print_r($new_array);

输出:

Array ( [zzzaaaa] => 1 [bbbb] => 1 [cccc] => 1 [zzzdddd] => 1 ) 
Array ( [yyyyaaaa] => 1 [bbbb] => 1 [cccc] => 1 [yyyydddd] => 1 )

示例链接

希望这可以帮助。

于 2013-10-08T17:18:11.757 回答
0

你可以使用这样的东西:

function stripOrChange(&$array,$parse,$changeto=false){
 foreach($array as $key=>$item){
  if(strpos($key,$parse) !== false && $key != $parse){
   if($changeto == 'true'){
   $array[$parse] = $array[$key];
   unset($array[$key]);
   }else{
   unset($array[$key]);  
   }
  }
 }
}

工作示例

于 2013-10-08T17:08:13.227 回答