2016-12-12 8 views
0

IはDNSレコードを含み、_このPHP - 処理アレイは、値

Array ([domain] => xxxx.com [record_id_+++711753] => 711753 [host_+++711753] => @ [type_+++711753] => A [priority_+++711753] => [value_+++711753] => 80.82.72.12 [record_id_+++711752] => 711752 [host_+++711752] => www [type_+++711752] => A [priority_+++711752] => [value_+++711752] => 80.82.72.12 [record_id_+++711754] => 711754 [host_+++711754] => @ [type_+++711754] => MX [priority_+++711754] => 20 [value_+++711754] => fallback.denit.net [record_id_+++711755] => 711755 [host_+++711755] => @ [type_+++711755] => MX [priority_+++711755] => 10 [value_+++711755] => ms.denit.net [record_id_+++711756] => 711756 [host_+++711756] => mail [type_+++711756] => A [priority_+++711756] => [value_+++711756] => 62.148.185.22 [record_id_+++711757] => 711757 [host_+++711757] => autodiscover [type_+++711757] => CNAME [priority_+++711757] => [value_+++711757] => autoredirect.mshex.nl [record_id_+++1148031] => 1148031 [host_+++1148031] => webmail [type_+++1148031] => CNAME [priority_+++1148031] => [value_+++1148031] => webmail.mshex.nl) 

ように見える+++ RECORD_IDおよびDNS値の型との間の区切り文字である配列を有します。

レコードを更新するためにAPIと話をする必要があります。このように動作します(例)。

$mdr->addParam("command", "dns_record_modify"   ); 
$mdr->addParam("domein", "xxx"   ); 
$mdr->addParam("tld",  "com"       ); 

$mdr->addParam("record_id", "461741"      ); 

$mdr->addParam("host",  "@"       ); 
$mdr->addParam("address", "mail2.xxx.com"); 
$mdr->addParam("priority", "20"       ); 

私はAPI値、ドメイン、TLDを埋めるためにexplodeを使用できることを知っています。

しかし、私は配列の値をrecord_idでグループ化し、host、type、およびpriorityのような複数の値を組み合わせたrecord_idごとにリクエストを発生させる方法があるようです。

どうすればよいですか?

答えて

0

explode()メソッドの使用については正しいですか。 IMOこれはソリューションに対する最良のアプローチです。私は、わずかなタイプミスのために答えを更新し、また動作するバージョンを追加しました。 See it here

# loop each entry 
foreach($array as $key => $value) 
{ 
    # [0] - record_id 
    # [1]/$value - 711753 

    # check that the key isn't domain since it doesn't contain _++ 
    if($key != 'domain') 
    { 
     $mdr->addParam(explode('_+++', $key)[0], $value); 
    } 
    else 
    { 
     $mdr->addParam($key,$value); 
    } 
} 

上記のコードは、コールバックの値を見つけるために、キーのうち_+++を爆発します。 $valueは、対応するデータコールバックを保持し、それぞれがaddParam()メソッドでインスタンス化されたオブジェクトを通過します。

配列キーのdomainコールバックに_+++ブレースが含まれていないため、explode()メソッドを使用する前にチェックを行いました。

+1

'!$ key = 'domain''は' $ key!=' domain''であるべきです。 – Barmar

+0

これを指摘していただき、ありがとうございます。 [OPはそれを見ることができます。](https://3v4l.org/RACZE)@Barmar – KDOT

0

配列値をrecord_idsでグループ化するには、新しい多次元配列を作成し、レコードIDを最上位キーとして使用できます。ここでは例です:あなたは別の構造体にデータを変換し、そのから$mdr->addParam通話作り出すことができる

$data = array(); 
$data['domain'] = 'xxxx.com'; 
$data['record_id_+++711753'] = 711753; 
$data['host_+++711753'] = '@'; 
$data['type_+++711753'] = 'A'; 
$data['type_+++1148031'] = 'CNAME'; 
$data['host_+++1148031'] = 'webmail'; 

$sorted_data = []; 

foreach($data as $key=>$val){ 
    $key_info = explode('_+++', $key); 
    if (count($key_info) > 1){ 
     $record_id = $key_info[1]; 
     $key_name = $key_info[0]; 
     $sorted_data[$record_id][$key_name] = $val; 
    } 

} 

var_dump($sorted_data); 
+0

ドメインはこの中から抜けていますが、キーには含まれていないので 'count($ key_info) 'を通さない'_ +++' – KDOT

+0

問題は、レコードIDをグループ化して – fredrover

+0

*とし、ホスト、タイプ、優先度などの複数の値を組み合わせたrecord_idあたりのリクエストを発生させる方法でした。 – KDOT

0

Array(
    [711753] => Array (
      [record_id] => 711753 
      [host] => @ 
      [type] => A 
      [priority] => 
      [address] => 80.82.72.12 
     ), 
    [711752] => Array (
      [record_id] => 711752 
      [host] => www 
      [type] => A 
      [priority] => 
      [address] => 80.82.72.12 
     ), 
... 

$domain = $data["domain"]; // "xxx.com" 
$tld = end(explode(".", $domain)) "com" 
$domain = substr($domain, count($domain)-count($tld)-1); // "xxx" 

$updates = []; 
foreach ($data as $key => $value) { 
    $parts = explode("_+++", $key); 
    if (count($parts) != 2) continue; 
    list($key, $rec) = $parts; 
    if ($key == "value") $key = "address"; 
    $updates[$rec][$key] = $value; 
} 

$updatesはこのようなものになりますそれから、あなたは続行します:

foreach($updates as $update) { 
    $mdr = new .... // some code to create new instance 

    $mdr->addParam("command", "dns_record_modify"); 
    $mdr->addParam("domein", $domain); 
    $mdr->addParam("tld", $tld); 
    foreach($update as $key => $value) { 
     $mdr->addParam($key, $value); 
    } 
    // execute mdr ... 
}