在Drupal返回的多维数组中搜索字符串的一部分

时间:2014-02-20 21:18:27

标签: php arrays drupal-7

我正在尝试在多维数组中找到字符串的一部分。

foreach ($invitees as $invitee) {
  if (in_array($invitee, $result)){
    echo 'YES';
  } else {
    echo 'NO';
  }
}

$invitees数组有2个元素:invitees array output

$result是我使用db_select()从Drupal数据库获得的内容 result array output

我要做的是,如果$invitees中某封电子邮件中的第一部分位于$result,则应回显“是”。 (“@”charather之前的部分)

例如:

“test.email”位于$result,所以=>是

“user.one”不在$result中,因此=> NO

我该怎么做?如何在多维数组中搜索字符串的一部分?

旁注:我注意到我从Drupal($result)得到的数组有2个“对象”,其中包含一个“字符串”,而不是像我期望的那样的数组。

例如:

$test = array('red', 'green', array('apple', 'banana'));

$result$test之间的差异: enter image description here 这对我如何搜索我的字符串有什么影响吗?

3 个答案:

答案 0 :(得分:1)

因为$ result是一个对象数组,所以您需要使用一个方法来访问该值并进行比较。所以,例如你可以这样做:

//1: create new array $results from array of objects in $result
foreach ($result as $r) {
    $results[] = get_object_vars($r);
}

//2: expanded, recursive in_array function for use with multidimensional arrays
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }
return false;
}

//3: check each element of the $invitees array
foreach ($invitees as $invitee) {
    echo in_array_r($invitee, $results) ? "Yes" : "No";
}

此外,对于某些照明,请查看this answer

答案 1 :(得分:0)

您可以使用preg_grep搜索数组,并在其之前和之后使用通配符。如果它返回一个或多个值,请使用key获取第一个的索引。然后检查它是否大于或等于0,这意味着它找到了一个匹配:)

<?php

$array = array('test1@gdfgfdg.com', 'test2@dgdgfdg.com', 'test3@dfgfdgdfg');

$invitee = 'test2';
$result = key(preg_grep('/^.*'.$invitee.'.*/', $array));

if ($result >= 0) {
    echo 'YES';
} else {
    echo 'NO';
}

?>

答案 2 :(得分:0)

接受了larsAnders的回答,因为他指出了我的递归函数方向。 这是我最终使用的(基于他的回答):

function Array_search($array, $string) {
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      Array_search($array[$key], $string);
    } else {
      if ($value->data == $string) {
        return TRUE;
      }
    }
  }
  return FALSE;
}