13

我有一个看起来像这样的数组

$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。

请注意,此数组的顺序是任意的,这意味着我需要根据“产品”名称值(而不是数组中的数字)更新值。

我试图通过数组中的数字访问它,但意识到由于这个原因这不起作用,我不确定如何基于另一个更改多维数组的一个元素的值。

谢谢你的帮助。

4

5 回答 5

25
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'].

于 2012-04-16T19:00:39.457 回答
9

我认为您必须遍历它们,例如:

foreach ($array as $k => $v) {
  if ($v['Product']=='Promising Widget') {
    $array[$k]['Value']=800;
  }
}
于 2012-04-16T19:00:10.557 回答
8

我认为最通用的方法是使用这样的array_walk_recursive函数:

array_walk_recursive($array, 'updateValue');

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

这样,即使您稍后将在此函数上更改数组,仍然可以正常工作。

于 2014-09-01T15:09:29.187 回答
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", $_ );
        }
    }
}
于 2014-05-07T11:24:29.067 回答
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);
        }
    });
}

此函数将重现现有数组

于 2019-02-05T16:17:27.210 回答