在PHP中更新多维数组

14

我有一个数组,它长这样

$array =
    Array
    (
    [0] => Array
        (
            [Product] =>  Amazing Widget
            [Value] => 200
        )

    [1] => Array
        (
            [Product] => Super Amazing Widget
            [Value] => 400
        )

    [2] => Array
        (
            [Product] =>  Promising Widget 
            [Value] => 300
        )

    [3] => Array
        (
            [Product] => Superb Widget
            [Value] => 400
        )
    }

我希望更新数组,将“Promising Widget”更改为800而不是300。

请注意,此数组的顺序是任意的,因此我需要根据“Product”的名称值(而不是其在数组中的编号)来更新该值。

我曾试图通过数组中的编号访问它,但意识到那样做行不通,我不知道如何基于另一个元素更改多维数组的一个元素的值。

感谢任何帮助。


尝试这个...循环搜索所需产品并保存其键,然后更改与该键关联的值? - WordsWorth
1
你是在生成这个数组吗?你能否改变它的结构? - Alex
1
正如@Alex所指出的那样,最好使用哈希表,其中键是产品名称。每个条目都将是属性的哈希表。 - Mr. Llama
5个回答

28
foreach($array as &$value){
    if($value['Product'] === 'Promising Widget'){
        $value['Value'] = 800;
        break; // Stop the loop after we've found the item
    }
}

因此,您可以通过循环遍历数组,找到要更改的值,然后进行更改。 &$value 是为了将数组按引用传递。这意味着我们可以直接从循环中编辑数组中的值,而不必执行$array[$key]['Value']


3
你应该在结尾处添加unset($value);,参考foreach手册中的第一个大红色警告 - dev_masta
在键值数组中,你也可以这样做。 foreach($array as $key=> &$values){ $values['value'] = $new_value; } - Kosmas

12
我认为你需要通过循环来处理它们,类似于这样:
foreach ($array as $k => $v) {
  if ($v['Product']=='Promising Widget') {
    $array[$k]['Value']=800;
  }
}

8

我认为最普遍的方法是使用array_walk_recursive函数,如下所示:

array_walk_recursive($array, 'updateValue');

function updateValue(&$data, $key) {
  if($key == 'Promising Widget') {
    $data = 800;
  }
}

这样,即使你以后更改了数组,这个函数仍然能正常工作。

绝不是“最通用的方法”。来自手册页面的内容:任何保存数组的键都不会传递给函数。 - CapelliC

2

这个答案可能有点晚了,但是我曾经遇到过类似的问题,使用这个函数解决了问题。

function r_search_and_replace( &$arr ) {
    foreach ( $arr as $idx => $_ ) {
        if( is_array( $_ ) ) r_search_and_replace( $arr[$idx] );
        else {
            if( is_string( $_ ) ) $arr[$idx] = str_replace( "PATTERN", "REPLACEMENT", $_ );
        }
    }
}

0

对于那些期望拥有最复杂数组的人,可以使用递归函数来遍历所有元素。

(假设这个函数在一个 PHP 类中)

public function reGenerateArray(&$arr)
{
    array_walk($arr, function (&$v, $k ) {
        if($k === 'KEY_NAME') {
            $v['OTHER_KEY'] = $newValueToReplace;
        } elseif("array" == gettype($v)) {
            $this->reGenerateArray($v);
        }
    });
}

这个函数将会复制现有的数组


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