【问题标题】:Loop through array with wildcard for element name使用通配符遍历数组以获取元素名称
【发布时间】:2021-11-19 10:44:00
【问题描述】:

我正在处理 Rightmove BLM 文件并将其转换为可以正常工作的数组。

但是,图像存储在顺序元素节点 MEDIA_IMAGE_00、01、02 等中。

我想知道是否有人可以建议我使用通配符或类似的 MEDIA_IMAGE_* 循环遍历这些顺序元素的最佳方法。

结构示例:

[MEDIA_IMAGE_00] => 003436_RX78401_IMG_00.jpg 
[MEDIA_IMAGE_TEXT_00] => 
[MEDIA_IMAGE_01] => 003436_RX78401_IMG_01.jpg 
[MEDIA_IMAGE_TEXT_01] => 
[MEDIA_IMAGE_02] => 003436_RX78401_IMG_02.jpg 
[MEDIA_IMAGE_TEXT_02] => 
[MEDIA_IMAGE_03] => 003436_RX78401_IMG_03.jpg

非常感谢!

【问题讨论】:

  • 首先向我们展示一个实际数据结构的示例。
  • 假设编号始终从 0 开始并且其中没有“孔” - 只需在循环内增加一个计数器变量,将其格式化为带前导零的两位数,将其附加到“前缀"MEDIA_IMAGE_,并检查是否确实存在具有该键的数组元素...当您找到第一个不存在的元素时,您可以停止循环。
  • 或者在你创建这个数据结构时将这些值粘贴到一个子数组中,然后你可以直接循环它。

标签: php arrays wildcard


【解决方案1】:

最简单的解决方案可能是:

foreach($array as $key=>$image)
{
   if(str_contains($key, 'MEDIA_IMAGE_'))
   {
       //$image is your filename for the current image
   }
}

但您可以改用 RegEx。 在这种情况下,您只需将 if 的条件更改为:

preg_match('/MEDIA_IMAGE_\d\d/', $key) === 1

【讨论】:

    【解决方案2】:

    您可以将array_filter() 与自己的过滤功能结合使用。

    示例

    $inputArray['MEDIA_IMAGE_00'] = '003436_RX78401_IMG_00.jpg';
    $inputArray['MEDIA_IMAGE_TEXT_00'] =  '';
    $inputArray['MEDIA_IMAGE_01'] = '003436_RX78401_IMG_01.jpg';
    $inputArray['MEDIA_IMAGE_TEXT_01'] = '';
    $inputArray['MEDIA_IMAGE_02'] = '003436_RX78401_IMG_02.jpg';
    $inputArray['MEDIA_IMAGE_TEXT_02'] = '';
    $inputArray['MEDIA_IMAGE_03'] = '003436_RX78401_IMG_03.jpg';
    
    var_dump($inputArray);
    
    /*
    array(7) {
      ["MEDIA_IMAGE_00"]=>
      string(25) "003436_RX78401_IMG_00.jpg"
      ["MEDIA_IMAGE_TEXT_00"]=>
      string(0) ""
      ["MEDIA_IMAGE_01"]=>
      string(25) "003436_RX78401_IMG_01.jpg"
      ["MEDIA_IMAGE_TEXT_01"]=>
      string(0) ""
      ["MEDIA_IMAGE_02"]=>
      string(25) "003436_RX78401_IMG_02.jpg"
      ["MEDIA_IMAGE_TEXT_02"]=>
      string(0) ""
      ["MEDIA_IMAGE_03"]=>
      string(25) "003436_RX78401_IMG_03.jpg"
    }
    */
    
    $inputArray = array_filter($inputArray, function($key) {
        return preg_match('/MEDIA_IMAGE_\d\d/', $key) === 1;
    }, ARRAY_FILTER_USE_KEY);
    
    var_dump($inputArray);
    /*
    array(4) {
      ["MEDIA_IMAGE_00"]=>
      string(25) "003436_RX78401_IMG_00.jpg"
      ["MEDIA_IMAGE_01"]=>
      string(25) "003436_RX78401_IMG_01.jpg"
      ["MEDIA_IMAGE_02"]=>
      string(25) "003436_RX78401_IMG_02.jpg"
      ["MEDIA_IMAGE_03"]=>
      string(25) "003436_RX78401_IMG_03.jpg"
    }
    */
    

    如果你只是想过滤掉空值,你甚至可以使用filter_array() 而不需要任何自定义函数。有关详细信息,请参阅文档。

    文档

    array_filter() 在 php 文档中。

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2018-11-03
      • 2018-09-18
      • 2017-06-28
      • 2014-11-10
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多