使用foreach循环更改多个字段中的嵌套数组值

时间:2018-01-13 14:58:51

标签: php mysql arrays foreach

尝试循环遍历数组(mysql db table的查询结果),找到四个不同的字段并添加前缀。

我有四个图像版本 - 全尺寸,中等,小,拇指 - 作为表字段(mysql)。值是文件名。我想为每个图像添加https:// ...前缀,以便我有每个图像的完整地址。

我的查询返回一个关联数组($myArray)。 foreach循环查找与图像字段的$key匹配,如果为true,则显示当前值,然后添加前缀,然后显示新值。显示为“新值”的内容包括前缀,以便部分代码按预期工作。

但是,当我之后显示$myArray时,“已更改”值不会更改。它们只是没有前缀的原始文件名。

我无法弄清楚如何将新值应用于数组。

这是我的代码:

$prefix = 'example.com/assets/images/';

foreach($myArray as $key => $value) {

  if ($key == 'image_full_size') {
     echo 'Current value: ' . $value['image_full_size'] . '<br>';
     $value['image_full_size'] = $prefix . $value['image_full_size'];
     echo 'New value: ' . $value['image_full_size'] . '<br>';
  }

  if ($key == 'image_med') {
     echo 'Current value: ' . $value['image_med'] . '<br>';
     $value['image_med'] = $prefix . $value['image_med'];
     echo 'New value: ' . $value['image_med']. '<br>';
  }

  if ($key == 'image_small') {
     echo 'Current value: ' . $value['image_small'] . '<br>';
     $value['image_small'] = $prefix . $value['image_small'];
     echo 'New value: ' . $value['image_small']. '<br>';
  }

  if ($key == 'image_thumb') {
     echo 'Current value: ' . $value['image_thumb'] . '<br>';
     $value['image_thumb'] = $prefix . $value['image_thumb'];
     echo 'New value: ' . $value['image_thumb']. '<br>';
  }
}

我很感激找到我的错误的任何帮助。

数组中的前两条记录:

Array
(
   [0] => Array
       (
           [id] => 1
           [laser_series] => GTO FLX
           [laser_model] => GTO/FLX01
           [laser_color] => red
           [price] => 118.75
           [image_full_size] => example.com/assets/images/laser-pistol/gto-flx01_black_red_1080x720.png
           [image_med] => example.com/assets/images/laser-pistol/gto-flx01_red_med.png
           [image_small] => example.com/assets/images/laser-pistol/gto-flx01_red_small.png
           [image_thumb] => example.com/assets/images/laser-pistol/gto-flx01_red_thumb.png
           [ad_blurb] => Custom-designed to fit this brand and model. The GTO/FLX series laser is the most technologically-advanced laser sight available for this popular pistol.
           [feature01] => Grip-Touch Activation by using FLX
           [feature02] => Side-Touch Activation without FLX
           [feature03] => Ultra-bright 635nm red laser
           [special_message] => 
           [mfr_name] => Kel-Tec
       )

   [1] => Array
       (
           [id] => 3
           [laser_series] => GTO FLX
           [laser_model] => GTO/FLX02
           [laser_color] => red
           [price] => 118.75
           [image_full_size] => gto-flx02_black_red_1080x720.png
           [image_med] => gto-flx02_red_med.png
           [image_small] => gto-flx02_red_small.png
           [image_thumb] => gto-flx02_red_thumb.png
           [ad_blurb] => Custom-designed to fit this brand and model. The GTO/FLX series laser is the most technologically-advanced laser sight available for this popular pistol.
           [feature01] => Grip-Touch Activation by using FLX
           [feature02] => Side-Touch Activation without FLX
           [feature03] => Ultra-bright 635nm red laser
           [special_message] => 
           [mfr_name] => Kel-Tec
       )
)

1 个答案:

答案 0 :(得分:0)

  

foreach循环查找与图像字段的$ key匹配,如果   true显示当前值,然后添加前缀,然后显示   新的价值。什么显示为&#34;新值&#34;包括前缀,   以便部分代码按预期工作。

不 - 它没有按预期工作。看起来就是这样。

您的行键是数字。但是你要将它们与这样的字符串进行比较:$key == 'image_full_size'。在这种情况下,PHP似乎将字符串强制转换为数字,即0。因此,如果$key0,则条件为真。你可以在这里看到这种行为:http://rextester.com/XDORW8182

这就是为什么它仅适用于键为0的第一行。

所以你的尝试是错的。一个有效的解决方案并不复杂:

foreach($myArray as $key => $row) {
    $myArray[$key]['image_full_size'] = $prefix . $row['image_full_size'];
    $myArray[$key]['image_med']       = $prefix . $row['image_med'];
    $myArray[$key]['image_small']     = $prefix . $row['image_small'];
    $myArray[$key]['image_thumb']     = $prefix . $row['image_thumb'];
}

演示:http://rextester.com/JEA91624

原始答案:

foreach($myArray as $key => $value) {
     $value['image_full_size'] = $prefix . $value['image_full_size'];
}

$value$myArray[$key]的(本地)副本,您正在更改该副本。如果您要更改$myArray中的原始行,则应通过$key访问该行:

$myArray[$key]['image_full_size'] = $prefix . $value['image_full_size'];

另一种方法是使用

通过引用访问该行
foreach($myArray as $key => &$value) {...}

但是这可能会产生一些不必要的副作用,所以你最好避免这种情况。