2014-11-06 153 views
1

我有一个现有的数组,我想从单个全名字段中分别提取名字和姓氏,并将每个字段都放入自己的变量中。我已经提取出了我需要的方式,但是当我离开'foreach'循环后,我似乎无法检索数据。无法从Foreach循环提取变量

我的阵列是这样的..

Array 
(
    [0] => 2 
    [1] => dduck 
    [2] => Donald Duck 
    [3] => [email protected] 
) 

当我运行foreach循环(如下图)回声作品。但是,如果我呼应$ firstName和$ lastName的循环外,什么也不显示....

这首先显示的名和姓

foreach ($t_result as $name) 
{ 
    preg_match('#^(\w+\.)?\s*([\'\’\w]+)\s+([\'\’\w]+)\s*(\w+\.?)?$#', $name, $results); 
    $firstName = $results[2]; 
    $lastname = $results[3]; 
    echo $firstName . " " . $lastname; 
} 

这显示任何

foreach ($t_result as $name) 
{ 
    preg_match('#^(\w+\.)?\s*([\'\’\w]+)\s+([\'\’\w]+)\s*(\w+\.?)?$#', $name, $results); 
    $firstName = $results[2]; 
    $lastname = $results[3]; 
} 
echo $firstName . " " . $lastname; 

任何想法?

+0

您是否在循环中和之后尝试过echo $ $ $ name?$ lastname?也许它会给你一些想法?并深入 - 'var_dump'这些值在循环中和之后。 – 2014-11-06 19:58:31

+0

是的,我做到了。循环后什么也没有显示。 '修复'是在循环中包含一个'if'语句。 – JonDoeCA 2014-11-06 20:39:12

回答

2

您不检查您的正则表达式是否匹配,因此对于与您不匹配的数组元素,将$firstName$lastname分配给未定义的索引。

示例数组在[3]元素上不匹配,所以这些变量在循环结束时或多或少是空的,使得循环外的回显不显示任何内容。

你可以尝试(在if声明包装的preg_match)类似如下:

foreach ($t_result as $name) 
{ 
    if (preg_match("#^(\w+\.)?\s*(['\’\w]+)\s+(['\’\w]+)\s*(\w+\.?)?$#", $name, $results)) { 
     $firstName = $results[2]; 
     $lastname = $results[3]; 
    } 
} 
echo $firstName . " " . $lastname; 
1

你需要用你特林在一个“如果”语句,否则的值返回变量被后续循环覆盖:

$t_result = array(
    0 => 2, 
    1 => 'dduck', 
    2 => 'Donald Duck', 
    3 => '[email protected]', 
); 

foreach ($t_result as $name) { 
    if (preg_match('#^(\w+\.)?\s*([\'\’\w]+)\s+([\'\’\w]+)\s*(\w+\.?)?$#', $name, $results)) { 
     $firstName = $results[2]; 
     $lastname = $results[3]; 
    } 
} 

echo $firstName . " " . $lastname;