我知道多维数组有很多答案,但我找不到我想要的东西。我是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”下的键/值对。这是关于深度的第三个阵列。数组的键名称将始终称为合并,但无法保证其在数组中的位置不会被移动。合并数组中键/值对的数量也是可变的。
我认为我需要的是array_walk_recursive的函数($ mArray,“myfunction”,$ search);其中$ search包含我正在寻找的Key名称(合并)的字符串。它需要遍历数组,直到找到键,检查它是否包含数组,然后(保留键),将每个键/值对返回到一个数组中。
因此,为清楚起见,函数的输出将返回:
$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 Parser获得的元素ID进行比较,并将属性值替换为单个数组中包含的属性值。 / p>
我可能需要一个foreach循环。我知道我可以使用is_array来验证$ search是否是一个数组。它正在加入我正在努力的所有事情。
感谢您的帮助。
答案 0 :(得分:1)
这会有用吗?
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 :(得分:0)
递归函数可以做到这一点。返回数组或失败时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 :-(";
}
答案 2 :(得分:0)
所以你想要访问数组中数组中的数组吗?
$mergeArray = NULL;
foreach($mArray['data'] as $mmArray)
$mergeArray[] = $mmArray['merges'];
那样的东西?如果merges
总是三个内心深处,我不明白为什么你需要递归。否则,请参阅其他答案。
答案 3 :(得分:0)
这是另一种方法,主要是因为我今天还没有用完我的迭代器配额。
$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();
答案 4 :(得分:0)
这是一个通用函数,它将通过嵌套数组工作,并返回与所提供键的第一次出现相关联的值。它允许整数或字符串键。如果未找到匹配的密钥,则返回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";
}
答案 5 :(得分:0)
array_walk_recursive()
非常适合这项任务!它不关心键值对的级别,它只迭代“叶子节点”,因此不需要检查元素是否包含字符串。在函数内部,我只是对键与针数组进行比较,以生成一维结果数组($sArray
)。
要清楚,我假设您的merges
子阵列中有可预测的密钥。
代码:(Demo)
$needles=['EMAIL','NAME','LNAME','ACCOUNT','ACCMANID','ACCMANTEL','ACCMANMAIL','ACCMANFN','ACCMANLN'];
array_walk_recursive($mArray,function($v,$k)use(&$sArray,$needles){if(in_array($k,$needles))$sArray[$k]=$v;});
var_export($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',
)