【问题标题】:Retrieving Values from an Array in PHP在 PHP 中从数组中检索值
【发布时间】:2016-11-05 13:49:52
【问题描述】:

如果您创建一个数组并使用函数 preg_match_all 填充值,您如何从数组中检索每个单独的值(基本上从索引 0 扫描到长度)?我想获取每个值并对其执行另一个函数,那么如何返回存储在数组中的每个值? (我想要索引 0、索引 1 等处的 arr 值)

$contents = file_get_contents('words.txt');
$arr = array();
preg_match_all($pattern, $contents, $arr); //finds all matches
$curr = current($arr);

我尝试这样做(我的模式写在别处)并在之后回显它,但我一直得到字符串“Array”。

【问题讨论】:

  • 我想拿起,除尘,并回答这个问题。您能否提供(作为对您问题的编辑)$contents 可能包含的内容的最小相关示例?你能解释一下你想捕捉哪些部分吗?有了这些新信息,我可以尝试为您提供解决方案。更新问题后请联系我。

标签: php arrays preg-match-all


【解决方案1】:
$contents=file_get_contents('words.txt');
$arr=array();
preg_match_all($pattern,$contents,$arr);//finds all matches
foreach ($arr as $item) {
  $curr=current($arr);
  // do something
}

【讨论】:

  • 感谢 foreach 循环的提示,但当回显时,我仍然知道 $curr 是“数组”。它应该返回“Array”吗?
【解决方案2】:

preg_match_all() 至少需要参数:(1) 正则表达式。 (2) 匹配正则表达式的字符串。它还需要第三个可选参数,该参数会自动填充所有找到的匹配项。这第三个参数是一个数字索引数组。因此,您可以像对待普通数组一样遍历它,也可以像对待任何普通数组一样对待它(它就是)。下面的代码段使用您的代码演示了这一点:

<?php

    $contents = file_get_contents('words.txt');
    //$arr    = array(); //<== NO NEED TO PRE-DECLARE THIS HERE

    preg_match_all($pattern, $contents, $arr);//finds all matches

    // IF YOU JUST WANT THE 1ST (CURRENT MATCH), SIMPLY USE current:
    $curr     = current($arr);
    // YOU MAY KEEP MOVING THE CURSOR TO THE NEXT ITEM LIKE SO:
    $next1    = next($arr);     
    $next2    = next($arr); 

    // OR JUST LOOP THROUGH THE FOUND MATCHES: $arr 
    foreach($arr as $match){
        $curr = current($arr); //<== BUT THIS IS SOMEWHAT REDUNDANT WITHIN THIS LOOP.

        // THE VARIABLE $match CONTAINS THE MATCHED STRING WITHIN THE CURRENT ITERATION:
        var_dump($match);      //<== RETURNS THE CURRENT VALUE WITHIN ITERATION
    }

    // YOU MAY EVEN USE NUMERIC INDEXES TO ACCESS THEM LIKE SO.
    $arrLen   = count($arr);
    $elem0    = isset($arr[0])?$arr[0]:null;
    $elem1    = isset($arr[1])?$arr[1]:null;
    $elem2    = isset($arr[2])?$arr[2]:null;
    $elem3    = isset($arr[3])?$arr[3]:null; //<== AND SO ON...

【讨论】:

    【解决方案3】:

    如果我理解你的问题,你想知道preg_match_all 的第三个参数中存储的结果如何。

    preg_match_all 将结果作为二维数组存储在第三个参数中。

    可能有两种结构,并且可以在第四个参数中使用两个常量显式设置。

    假设您有一个包含两个捕获组的模式,并且您的主题字符串包含 3 次出现的模式:

    1) PREG_PATTERN_ORDER 是返回类似内容的默认设置:

    [
        0 => [ 0 => 'whole match 1',
               1 => 'whole match 2',
               2 => 'whole match 3' ],
    
        1 => [ 0 => 'capture group 1 from match 1',  
               1 => 'capture group 1 from match 2',
               2 => 'capture group 1 from match 3' ],
    
        2 => [ 0 => 'capture group 2 from match 1',  
               1 => 'capture group 2 from match 2',
               2 => 'capture group 2 from match 3' ]
    ]
    

    2) PREG_SET_ORDER 返回类似的内容:

    [
        0 => [ 0 => 'whole match 1',
               1 => 'capture group 1 from match 1',
               2 => 'capture group 2 from match 1' ],
    
        1 => [ 0 => 'whole match 2',
               1 => 'capture group 1 from match 2',
               2 => 'capture group 2 from match 2' ],
    
        2 => [ 0 => 'whole match 3',
               1 => 'capture group 1 from match 3',
               2 => 'capture group 2 from match 3' ]
    ]
    

    具体的例子可以在PHP manual 中找到。您只需要选择哪个更方便您需要做的事情。

    因此,要应用您的函数,您只需执行foreach 循环或使用array_map(这也是一个隐藏循环,但更短更慢)。

    一般来说,如果您不确定变量的结构是什么,您可以使用print_rvar_dump 来了解它的样子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2015-08-26
      • 2015-08-07
      • 2013-06-22
      • 1970-01-01
      相关资源
      最近更新 更多