首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -根据键名从多维数组创建单个数组

问PHP -根据键名从多维数组创建单个数组
EN

Stack Overflow用户
提问于 2011-09-14 16:41:47
回答 6查看 2.9K关注 0票数 1

我知道有很多关于多维数组的答案,但我找不到确切的答案。我是PHP的新手,不能完全理解其他一些示例来修改它们。如果有人能给我指路,我将不胜感激。

一个外部服务正在向我传递以下多维数组。

代码语言:javascript
复制
$mArray = Array (
  [success] => 1
  [errors] => 0
  [data] => Array (
    [0] => Array (
      [email] => me@example.com
      [id] => 123456 
      [email_type] => html 
      [ip_opt] => 10.10.1.1 
      [ip_signup] => 
      [member_rating] => X 
      [info_changed] => 2011-08-17 08:56:51 
      [web_id] => 123456789
      [language] =>
      [merges] => Array (
        [EMAIL] => me@example.com
        [NAME] => Firstname 
        [LNAME] => Lastname 
        [ACCOUNT] => ACME Ltd 
        [ACCMANID] => 123456adc 
        [ACCMANTEL] => 1234 123456 
        [ACCMANMAIL] => an.other@example.com
        [ACCMANFN] => Humpty
        [ACCMANLN] => Dumpty 
      )
      [status] => unknown
      [timestamp] => 2011-08-17 08:56:51
      [lists] => Array ( ) 
      [geo] => Array ( ) 
      [clients] => Array ( ) 
      [static_segments] => Array ( )
    ) 
  ) 
)

我唯一感兴趣的信息是键名为'merges‘的数组中保存的键/值对。它大约是第三个数组深度。数组的键名将始终称为merges,但不能保证它在数组中的位置不会被移动。合并数组中的键/值对的数量也是可变的。

我认为我需要的是array_walk_recursive($mArray,"myfunction",$search);的函数,其中$search保存我正在查找的键名(合并)的字符串。它需要遍历数组,直到找到键,检查它是否持有数组,然后(保留键)将每个键/值对返回到单个数组中。

因此,为了清楚起见,函数的输出将返回:

代码语言:javascript
复制
    $sArray = Array (
      [EMAIL] => me@example.com
      [NAME] => Firstname 
      [LNAME] => Lastname 
      [ACCOUNT] => ACME Ltd 
      [ACCMANID] => 123456adc 
      [ACCMANTEL] => 1234 123456 
      [ACCMANMAIL] => an.other@example.com 
      [ACCMANFN] => Humpty 
      [ACCMANLN] => Dumpty
    )

然后,我可以进入项目的下一步,将单个合并数组中的键与从HTML DOM解析器获得的元素I进行比较,并将属性值替换为包含在单个数组中的值。

我可能需要一个foreach循环。我知道我可以使用is_array来验证$search是否是一个数组。这就是我一直在努力解决的问题。

谢谢你的帮助。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-15 19:16:59

下面是一个通用函数,它将遍历嵌套数组,并返回与第一次出现所提供的键相关的值。它允许使用整型或字符串键。如果没有找到匹配键,则返回false。

代码语言:javascript
复制
// return the value a key in the supplied array  
function get_keyval($arr,$mykey)
{  
    foreach($arr as $key => $value){
        if((gettype($key) == gettype($mykey)) && ($key == $mykey)) {
            return $value;
        }
        if(is_array($value)){
            return get_keyval($value,$mykey);               
        }
    }
    return false;
}

// test it out
$myArray = get_keyval($suppliedArray, "merges");
foreach($myArray as $key => $value){
    echo "$key = $value\n";
}
票数 0
EN

Stack Overflow用户

发布于 2011-09-14 16:55:56

这样行得通吗?

代码语言:javascript
复制
function find_merges($arr)
{
  foreach($arr as $key => $value){
    if($key == "merges") return $value;
    if(is_array($value)){
      $ret = find_merges($value);
      if($ret) return $ret;
    }
  }
  return false;
}

它将执行深度优先搜索,直到您用完所有键或找到一个值为merges的键。它不会检查merges是否是一个数组。试一试,让我知道它是否有效。

票数 1
EN

Stack Overflow用户

发布于 2011-09-14 16:59:27

递归函数可以做到这一点。失败时返回数组或FALSE。

代码语言:javascript
复制
function search_sub_array ($array, $search = 'merges') {
  if (!is_array($array)) return FALSE; // We're not interested in non-arrays
  foreach ($array as $key => $val) { // loop through array elements
    if (is_array($val)) { // We're still not interested in non-arrays
      if ($key == $search) {
        return $val; // We found it, return it
      } else if (($result = search_sub_array($array)) !== FALSE) { // We found a sub-array, search that as well
        return $result; // We found it, return it
      }
    }
  }
  return FALSE; // We didn't find it
}

// Example usage
if (($result = search_sub_array($myArray,'merges')) !== FALSE) {
  echo "I found it! ".print_r($result,TRUE);
} else {
  echo "I didn't find it :-(";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7413535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档