如何使用 PHP 遍历多维数组并另存为 JSON/BSON?
How to iterate through multidimensional array with PHP & save as JSON/BSON?
我有这段代码,请随意跳到我试图遍历数组的代码底部,我留下了整个代码,以便它可以用于测试目的。
<?php
//Saves all the attributes of all entries into an array.
function cleanUpEntry( $entry ) {
$retEntry = array();
for ( $i = 0; $i < $entry["count"]; $i++ ) {
if (is_array($entry[$i])) {
$subtree = $entry[$i];
//This condition should be superfluous so just take the recursive call
//adapted to your situation in order to increase perf.
if ( ! empty($subtree['dn']) and ! isset($retEntry[$subtree['dn']])) {
$retEntry[$subtree['dn']] = cleanUpEntry($subtree);
}
else {
$retEntry[] = cleanUpEntry($subtree);
}
}
else {
$attribute = $entry[$i];
if ( $entry[$attribute]['count'] == 1 ) {
$retEntry[$attribute] = $entry[$attribute][0];
} else {
for ( $j = 0; $j < $entry[$attribute]['count']; $j++ ) {
$retEntry[$attribute][] = $entry[$attribute][$j];
}
}
}
}
return $retEntry;
}
$ldaprdn = "cn=read-only-admin,dc=example,dc=com";
$ldappass ="password";
$ldapuri = "ldap.forumsys.com";
// Connecting to LDAP
$ldapconn = ldap_connect($ldapuri)
or die("That LDAP-URI was not parseable");
//We need to set the LDAP Protocol Version or else it isn't able to bind properly to the LDAP server.
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
//We bind to the LDAP server using the previous credentials and location.
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);
// Verify if bind was successful or not
if ($ldapbind) {
echo "LDAP bind successful...\n";
} else {
echo "LDAP bind failed...\n";
}
//Gives where to search & what to search for
$dn = "dc=example,dc=com";
$filter = "(objectclass=*)";
//Saves the result into result variable
$result = ldap_search($ldapconn, $dn, $filter);
$info = ldap_get_entries($ldapconn, $result);
$header = array_fill_keys($headers, null);
$output = [];
//Gets the search results and saves into details variable.
$details = cleanUpEntry($info);
print_r($details);
//HERE'S MY ISSUE: The array isn't being iterated through properly.
foreach ( $details as $name => $entry ){
echo "\nName: " . $name . "\n";
if(is_array($entry)){
foreach (array_keys($entry) as $array_key => $value)
//echo "Entry: " . $array_key . ":" . $value . "\n";
echo $value . "\n";
//This foreach doesn't work.
/*foreach ($value as $key1 => $value2){
echo $key1.":".$value;
}*/
}else{
foreach($entry as $key => $value){
echo $key . ":" . $value . "\n";
}
//echo "Entry: " . $entry . "\n";
}
}
?>
这是数组的样子,我省略了大部分元素,但是如果你复制我上面的原始代码,你可以看到整个数组:
Array
(
[dc=example,dc=com] => Array
(
[objectclass] => Array
(
[0] => top
[1] => dcObject
[2] => organization
)
[o] => example.com
[dc] => example
)
[cn=admin,dc=example,dc=com] => Array
(
[objectclass] => Array
(
[0] => simpleSecurityObject
[1] => organizationalRole
)
[cn] => admin
[description] => LDAP administrator
)
[uid=newton,dc=example,dc=com] => Array
(
[sn] => Newton
[objectclass] => Array
(
[0] => inetOrgPerson
[1] => organizationalPerson
[2] => person
[3] => top
)
[uid] => newton
[mail] => newton@ldap.forumsys.com
[cn] => Isaac Newton
)
基本上,我目前的输出是:
Name: dc=example,dc=com
objectclass
o
dc
Name: cn=admin,dc=example,dc=com
objectclass
cn
description
Name: uid=newton,dc=example,dc=com
sn
objectclass
uid
mail
cn
它应该看起来像:
Name: dc=example,dc=com
objectclass:top
objectclass: dcObject
objectclass: organization
o: example.com
dc: example
Name: cn=admin,dc=example,dc=com
objectclass: simpleSecurityObject
objectclass: organizationalRole
cn: admin
description: LDAP administrator
Name: uid=newton,dc=example,dc=com
sn: Newton
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
objectclass: top
uid: newton
mail: newton@ldap.forumsys.com
cn: Isaac Newton
如果你能进入 JSON 和 BSON 则可获得奖励积分,因为这将用于添加到 MongoDB
假设它只有两个级别,您可以轻松地执行 2 个 foreach
循环:
<?php
$arr = [
'dc=example,dc=com' => [
'objectclass' => [
'top',
'dcObject',
'organization'
],
'o' => 'example.com',
'dc' => 'example'
],
'cn=admin,dc=example,dc=com' => [
'objectclass' => [
'simpleSecurityObject',
'organizationalRole'
],
'cn' => 'admin',
'description' => 'LDAP administrator'
],
'uid=newton,dc=example,dc=com' => [
'sn' => 'Newton',
'objectclass' => [
'inetOrgPerson',
'organizationalPerson',
'person',
'top'
],
'uid' => 'newton',
'mail' => 'newton@ldap.forumsys.com',
'cn' => 'Isaac Newton'
]
];
foreach($arr as $name => $settings) {
$new[] = PHP_EOL."Name: {$name}";
foreach($settings as $k => $v) {
$new[] = "{$k}: ".((is_array($v))? implode(PHP_EOL."{$k}: ", $v) : $v);
}
}
print_r(trim(implode(PHP_EOL, $new)));
会给你:
Name: dc=example,dc=com
objectclass: top
objectclass: dcObject
objectclass: organization
o: example.com
dc: example
Name: cn=admin,dc=example,dc=com
objectclass: simpleSecurityObject
objectclass: organizationalRole
cn: admin
description: LDAP administrator
Name: uid=newton,dc=example,dc=com
sn: Newton
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
objectclass: top
uid: newton
mail: newton@ldap.forumsys.com
cn: Isaac Newton
至于 json
,您可能只需使用 json_encode($arr)
使其自动变为 json(如评论中所述)。
我有这段代码,请随意跳到我试图遍历数组的代码底部,我留下了整个代码,以便它可以用于测试目的。
<?php
//Saves all the attributes of all entries into an array.
function cleanUpEntry( $entry ) {
$retEntry = array();
for ( $i = 0; $i < $entry["count"]; $i++ ) {
if (is_array($entry[$i])) {
$subtree = $entry[$i];
//This condition should be superfluous so just take the recursive call
//adapted to your situation in order to increase perf.
if ( ! empty($subtree['dn']) and ! isset($retEntry[$subtree['dn']])) {
$retEntry[$subtree['dn']] = cleanUpEntry($subtree);
}
else {
$retEntry[] = cleanUpEntry($subtree);
}
}
else {
$attribute = $entry[$i];
if ( $entry[$attribute]['count'] == 1 ) {
$retEntry[$attribute] = $entry[$attribute][0];
} else {
for ( $j = 0; $j < $entry[$attribute]['count']; $j++ ) {
$retEntry[$attribute][] = $entry[$attribute][$j];
}
}
}
}
return $retEntry;
}
$ldaprdn = "cn=read-only-admin,dc=example,dc=com";
$ldappass ="password";
$ldapuri = "ldap.forumsys.com";
// Connecting to LDAP
$ldapconn = ldap_connect($ldapuri)
or die("That LDAP-URI was not parseable");
//We need to set the LDAP Protocol Version or else it isn't able to bind properly to the LDAP server.
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
//We bind to the LDAP server using the previous credentials and location.
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);
// Verify if bind was successful or not
if ($ldapbind) {
echo "LDAP bind successful...\n";
} else {
echo "LDAP bind failed...\n";
}
//Gives where to search & what to search for
$dn = "dc=example,dc=com";
$filter = "(objectclass=*)";
//Saves the result into result variable
$result = ldap_search($ldapconn, $dn, $filter);
$info = ldap_get_entries($ldapconn, $result);
$header = array_fill_keys($headers, null);
$output = [];
//Gets the search results and saves into details variable.
$details = cleanUpEntry($info);
print_r($details);
//HERE'S MY ISSUE: The array isn't being iterated through properly.
foreach ( $details as $name => $entry ){
echo "\nName: " . $name . "\n";
if(is_array($entry)){
foreach (array_keys($entry) as $array_key => $value)
//echo "Entry: " . $array_key . ":" . $value . "\n";
echo $value . "\n";
//This foreach doesn't work.
/*foreach ($value as $key1 => $value2){
echo $key1.":".$value;
}*/
}else{
foreach($entry as $key => $value){
echo $key . ":" . $value . "\n";
}
//echo "Entry: " . $entry . "\n";
}
}
?>
这是数组的样子,我省略了大部分元素,但是如果你复制我上面的原始代码,你可以看到整个数组:
Array
(
[dc=example,dc=com] => Array
(
[objectclass] => Array
(
[0] => top
[1] => dcObject
[2] => organization
)
[o] => example.com
[dc] => example
)
[cn=admin,dc=example,dc=com] => Array
(
[objectclass] => Array
(
[0] => simpleSecurityObject
[1] => organizationalRole
)
[cn] => admin
[description] => LDAP administrator
)
[uid=newton,dc=example,dc=com] => Array
(
[sn] => Newton
[objectclass] => Array
(
[0] => inetOrgPerson
[1] => organizationalPerson
[2] => person
[3] => top
)
[uid] => newton
[mail] => newton@ldap.forumsys.com
[cn] => Isaac Newton
)
基本上,我目前的输出是:
Name: dc=example,dc=com
objectclass
o
dc
Name: cn=admin,dc=example,dc=com
objectclass
cn
description
Name: uid=newton,dc=example,dc=com
sn
objectclass
uid
mail
cn
它应该看起来像:
Name: dc=example,dc=com
objectclass:top
objectclass: dcObject
objectclass: organization
o: example.com
dc: example
Name: cn=admin,dc=example,dc=com
objectclass: simpleSecurityObject
objectclass: organizationalRole
cn: admin
description: LDAP administrator
Name: uid=newton,dc=example,dc=com
sn: Newton
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
objectclass: top
uid: newton
mail: newton@ldap.forumsys.com
cn: Isaac Newton
如果你能进入 JSON 和 BSON 则可获得奖励积分,因为这将用于添加到 MongoDB
假设它只有两个级别,您可以轻松地执行 2 个 foreach
循环:
<?php
$arr = [
'dc=example,dc=com' => [
'objectclass' => [
'top',
'dcObject',
'organization'
],
'o' => 'example.com',
'dc' => 'example'
],
'cn=admin,dc=example,dc=com' => [
'objectclass' => [
'simpleSecurityObject',
'organizationalRole'
],
'cn' => 'admin',
'description' => 'LDAP administrator'
],
'uid=newton,dc=example,dc=com' => [
'sn' => 'Newton',
'objectclass' => [
'inetOrgPerson',
'organizationalPerson',
'person',
'top'
],
'uid' => 'newton',
'mail' => 'newton@ldap.forumsys.com',
'cn' => 'Isaac Newton'
]
];
foreach($arr as $name => $settings) {
$new[] = PHP_EOL."Name: {$name}";
foreach($settings as $k => $v) {
$new[] = "{$k}: ".((is_array($v))? implode(PHP_EOL."{$k}: ", $v) : $v);
}
}
print_r(trim(implode(PHP_EOL, $new)));
会给你:
Name: dc=example,dc=com
objectclass: top
objectclass: dcObject
objectclass: organization
o: example.com
dc: example
Name: cn=admin,dc=example,dc=com
objectclass: simpleSecurityObject
objectclass: organizationalRole
cn: admin
description: LDAP administrator
Name: uid=newton,dc=example,dc=com
sn: Newton
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
objectclass: top
uid: newton
mail: newton@ldap.forumsys.com
cn: Isaac Newton
至于 json
,您可能只需使用 json_encode($arr)
使其自动变为 json(如评论中所述)。