在一个二维数组的列值中替换子字符串

3

我正在尝试使用str_replace()函数从一个数组中的value4元素中删除"my."。

然而,str_replace("my.", "", $myarray);没有改变任何东西。

str_replace()函数不能在二维数组上工作吗?

我的样本数据和编码尝试:

$array = [
    [
        'value1' => 'John Doe',
        'value2' => 'Father',
        'value3' => '',
        'value4' => 'http://www.website.my.com'
    ],
    [
        'value1' => 'Jane Doe',
        'value2' => 'Mother',
        'value3' => '',
        'value4' => 'http://www.website.my.com'
    ]
    // ...
];
$out = str_replace('.my', '', $array);
var_export($out);

@MarkBaker 它也可以与数组一起使用,但不能用于多维数组。 - Rizier123
4个回答

8
不,它可以在字符串或单维数组上工作... 但是你可以通过在array_walk_recursive中使用回调函数来应用它。
array_walk_recursive(
    $myarray,
    function (&$value) {
        $value = str_replace('.my', '', $value);
    }
);

我不确定,但是根据我的理解,他只想替换这个键“value4”中的内容:“在这些数组的value4字段之外”。但是也许楼主需要更清晰地表达。 - Rizier123

4
您可以使用array_walk_recursive() http://php.net/manual/en/function.array-walk-recursive.php 来对每个子元素进行替换(注意:回调函数仅对叶子节点(非数组)触发):
$myArray = array(0 => "my.test", 2=> array("test" => "my.thing"));

array_walk_recursive($myArray, "removeMy");

function removeMy(&$element, $index){
   $element = str_replace("my.", "", $element);
}


print_r($myArray); // Array ( [0] => test [2] => Array ( [test] => thing ) ) 

如果替换只应出现在value4键上-请将其作为条件添加:
function removeMy(&$element, $index){
  if ($index === "value4"){
       $element = str_replace("my.", "", $element);
  }
}

这最终对我起作用了。唯一的问题是,我如何将更改后的值写回数组中?似乎这样做不行。 - n1nja
抱歉,我在输入$value之前打错了您的答案,并且我错过了“&”符号。谢谢!因此,“&”使其写入源数组。 - n1nja
@n1nja 在方法输入参数前面加上 & 符号会使变量仅仅包含对原始变量的引用。如果不加 & 使用 $element 会创建一个准确的副本,你可以修改该副本而不影响原始数组。 - dognose

2
让它变得简单。
foreach ($array as &$item)
   $item['value4'] = str_replace('my.', "", $item['value4']);

0
我同意@ splash58的观点,对于你的二维数组没有必要使用递归方法。
你可以通过foreach()直接访问和修改特定列的值。在循环签名中声明&$v可以确保对该值的任何更改都会反映在原始数组中。
代码:(演示
foreach ($array as ['value4' => &$v]) {
    $v = str_replace("my.", "", $v);
}
var_export($array);

当然,整行也可以这样做,但您的示例数据表明只有一个列被有意义地瞄准。无论如何,以下是如何使用str_replace()以相同方式修改1维数组的方法:(演示)
foreach ($array as &$row) {
    $row = str_replace("my.", "", $row);
}
var_export($array);

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