PHP-基于键名从多维数组创建单个数组

PHP-基于键名从多维数组创建单个数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我知道关于多维数组有很多答案,但我找不到我想要的确切答案。我是PHP新手,不能完全理解其他一些例子来修改它们。如果有人能给我指路,我将不胜感激 外部服务正在向我传递以下多维数组 $mArray = Array ( [success] => 1 [errors] => 0 [data] => Array ( [0] => Array ( [email] => me@example.com [id] => 123456

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

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

$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,但不能保证它在数组中的位置不会被移动。merges数组中的键/值对数量也是可变的

我想我需要的是一个数组_walk _recursive($mArray,“myfunction”,$search);,的函数;,其中$search包含我要查找的键名(合并)的字符串。它需要遍历数组,直到找到键,检查它是否持有数组,然后(保留键),将每个键/值对返回到单个数组中

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

    $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解析器获得的元素ID进行比较,并用单个数组中包含的值替换属性值

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

谢谢你的帮助。

这样行吗

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
是否为数组。试试看,如果行得通,请告诉我。

行得通吗

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
是否为数组。试试看,然后告诉我这是否有效。

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

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 :-(";
}

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

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 :-(";
}

那么您想访问数组中的数组吗

$mergeArray = NULL;
foreach($mArray['data'] as $mmArray)
    $mergeArray[] = $mmArray['merges'];

像这样的?如果
merges
在深处总是三个,我不明白为什么需要递归。否则,请查看其他答案。

那么您想访问数组中的数组吗

$mergeArray = NULL;
foreach($mArray['data'] as $mmArray)
    $mergeArray[] = $mmArray['merges'];

像这样的?如果
merges
在深处总是三个,我不明白为什么需要递归。否则,请查看其他答案。

这里是另一种方法,主要是因为我今天还没有用完迭代器配额

$search = new RegexIterator(
    new RecursiveIteratorIterator(
        new ParentIterator(new RecursiveArrayIterator($array)),
        RecursiveIteratorIterator::SELF_FIRST),
    '/^merges$/D', RegexIterator::MATCH, RegexIterator::USE_KEY
);
$search->rewind();
$merges = $search->current();

这里是另一种方法,主要是因为我今天还没有用完迭代器配额

$search = new RegexIterator(
    new RecursiveIteratorIterator(
        new ParentIterator(new RecursiveArrayIterator($array)),
        RecursiveIteratorIterator::SELF_FIRST),
    '/^merges$/D', RegexIterator::MATCH, RegexIterator::USE_KEY
);
$search->rewind();
$merges = $search->current();

这是一个通用函数,它将通过嵌套数组工作,并返回与所提供键的第一次出现相关联的值。它允许整数或字符串键。如果没有找到匹配的密钥,则返回false

// 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";
}

这是一个通用函数,它将通过嵌套数组工作,并返回与所提供键的第一次出现相关联的值。它允许整数或字符串键。如果没有找到匹配的密钥,则返回false

// 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";
}
array\u walk\u recursive()
非常适合这个任务!它不关心键值对在什么级别,它只迭代“叶节点”,因此不需要检查元素是否包含字符串。在函数内部,我只是将键与针数组进行比较,以生成一维结果数组(
$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',
)
array\u walk\u recursive()
非常适合这个任务!它不关心键值对在什么级别,它只迭代“叶节点”,因此不需要检查元素是否包含字符串。在函数内部,我只是将键与针数组进行比较,以生成一维结果数组(
$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',
)

几乎,但不完全-您不能确保
合并
包含一个数组,而且它可能是一个空数组,因此您需要执行
$ret!==错误
。看我的答案…这对我不起作用。它只是返回了原始数组。几乎,但不完全-您不能确保
合并
包含一个数组,并且它可能是一个空数组,因此您需要执行
$ret!==错误
。看我的答案…这对我不起作用。它刚刚返回了原始数组。谢谢,但我不能保证“合并”始终是三个。我认为递归仍然是对任何更改都最灵活的。谢谢,但我不能保证“合并”在本质上总是三个。我认为递归对任何更改都是最灵活的。谢谢,这很有效。我抬头看了看。如果我理解正确,您要确保$key和$mykey都是相同的类型(字符串或数字),然后它们彼此相等(或匹配)?没错。如果您尝试将字符串与数字进行比较,PHP可能会返回假阳性匹配。更简单的方法是使用严格的比较
==
来防止PHP的类型转换。请参阅本页,该页解释并演示了进行松散比较的潜在问题:谢谢,这非常有效。我抬头看了看。如果我理解正确,您要确保$key和$mykey都是相同的类型(字符串或数字),然后它们彼此相等(或匹配)?没错。PHP可以返回一个假阳性m