我有一个关联的数组。我希望能够删除其键以任何给定长度的给定字符串开头的所有元素。我还希望能够将以给定字符串开头的所有键重命名为由键的其余部分附加的新字符串。例如,给定初始数组,删除所有以“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,因此如果删除或重命名子目录,则还会删除或重命名对其他目录和文件的所有引用。
EDIT。这就是我最终的目标。不知道是否有更快/更少的代码方式。
//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]);
}
}
答案 0 :(得分: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 )
希望这有帮助。
答案 1 :(得分: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]);
}
}
}
}