2015-12-02 55 views
0

我有一个关联数组的数组,我想更新这个数组中的值,因此我创建了一个看起来像这样的函数。PHP:替换阵列数据

//The Array of Associative arrays 
array (size=2) 
    0 => 
    array (size=3) 
     'slang' => string 'Tight' (length=5) 
     'description' => string 'Means well done' (length=15) 
     'example-sentence' => string 'Prosper it Tight on that job' (length=28) 
    1 => 
    array (size=3) 
     'slang' => string 'Sleet' (length=5) 
     'description' => string 'Means to send on long errand' (length=28) 
     'example-sentence' => string 'I am going to sleep sia' (length=23) 

//功能

public function update($slang, $new) 
{ 
    array_map(function($data, $key) use($slang, $new) 
    { 
    if($data['slang'] == $slang) 
    { 
     $data[$key] = array_replace($data, $new); 
    } 
    }, UrbanWord::$data); 
} 

我累了运行此,但原来的阵列将不会更新。我需要帮助如何去解决这个问题。

感谢

+3

Afaik,'array_map'返回一个包含映射数据的数组。你似乎没有抓住那个回报。 –

+0

@Afaik,是的,谢谢,修复仍然不起作用 –

+0

尽管我喜欢'array_map',如果你想用内联替换数组元素,普通的'foreach'(或'array_walk')在这里可能更合适恕我直言。 –

回答

1

您可以使用array_reduce代替array_map如下:

public function update($array, $slang, $new) 
{ 
    return array_reduce($array, function ($result, $item) use ($slang, $new) { 
    if ($item['slang'] == $slang) { 
     $item = array_replace($item, $new); 
    } 

    $result[] = $item; 

    return $result; 
    }, array()); 
} 

用法:

UrbanWord::$data = $this->update(
    UrbanWord::$data, 
    'Tight', 
    array('description' => 'another description') 
); 
var_dump($myUpdatedArray); 

如果要更新引用您可以尝试直接传递UrbanWord::$data例如:

class UrbanWord 
{ 
    public static $data = array(
     array(
      'slang' => 'Test', 
      'Desc' => 'Frist Desc' 
     ), 
     array(
      'slang' => 'Test1', 
      'Desc' => 'Second Desc' 
     ) 
    ); 
} 

class MyClass 
{ 
    public function update(&$array, $slang, $new) 
    { 
     $array = array_reduce($array, function ($result, $item) use ($slang, $new) { 
      if ($item['slang'] == $slang) { 
       $item = array_replace($item, $new); 
      } 

      $result[] = $item; 

      return $result; 
     }, array()); 
    } 
} 

$myClass = new MyClass(); 
$myClass->update(UrbanWord::$data, 'Test', array('Desc' => 'test')); 

echo '<pre>'; 
var_dump(UrbanWord::$data); 
echo '</pre>';