2016-10-13 57 views
0

我想將多維數組轉換爲簡單數組。我的代碼的某些部分正在工作,但當我必須保留一個子數組時,我已經丟失了。這裏是主陣列:將多維數組轉換爲簡單數組

Array 
(
    [0] => Array 
     (
      [name] => scattr 
      [value] => 250 
     ) 

    [1] => Array 
     (
      [name] => scattrtel 
      [value] => 9830293789 
     ) 

    [2] => Array 
     (
      [name] => scattrcolor 
      [value] => #2764C6 
     ) 

    [3] => Array 
     (
      [name] => scattrta 
      [value] => 
     ) 

    [4] => Array 
     (
      [name] => scattrcb 
      [value] => 
     ) 

    [5] => Array 
     (
      [name] => scattrmcb[1] 
      [value] => 10 
     ) 

    [6] => Array 
     (
      [name] => scattrmcb[4] 
      [value] => 40 
     ) 

    [7] => Array 
     (
      [name] => scattrmrdo 
      [value] => 20 
     ) 

    [8] => Array 
     (
      [name] => scattrselect 
      [value] => 30 
     ) 

    [9] => Array 
     (
      [name] => pwpus-shortcode-nonce 
      [value] => 028c9426c5 
     ) 

    [10] => Array 
     (
      [name] => _wp_http_referer 
      [value] => /wp-admin/admin-ajax.php 
     ) 

) 

而且,我的PHP把它轉換成簡單的數組:

$new = array(); 

foreach ($datas as $data) { // $datas as being the multidimensional array. 
    $new[$data['name']] = $data['value']; 
} 

現在,的$newprint_r給我:

Array 
(
    [scattr] => 250 
    [scattrtel] => 9830293789 
    [scattrcolor] => #2764C6 
    [scattrta] => gdkwsdghwkdhgk 
    [scattrcb] => 
    [scattrmcb[1]] => 10 
    [scattrmcb[4]] => 40 
    [scattrmrdo] => 20 
    [scattrselect] => 30 
    [pwpus-shortcode-nonce] => 028c9426c5 
    [_wp_http_referer] => /wp-admin/admin-ajax.php 
) 

所以,我認爲我的代碼在某種程度上可行,但不能保留數組中的scattrmcb[1]scattrmcb[4]。應該給這樣的事情:

[scattrmcb] => Array 
      (
       [1] => 10 
       [4] => 40 
      ) 

我該怎麼做?

感謝

+0

最初被誤解,編輯... – AbraCadaver

+0

完全一邊,但'data'是複數,單數是'datum'。 – Fraser

回答

1

所以array_column()會得到你最方式。我用正則表達式來拿到鑰匙和內部數組索引,然後eval() != evil

foreach(array_column($datas, 'value', 'name') as $key => $value) { 
    if(preg_match('/(.*)(\[\d+\])$/', $key, $match)) { 
     eval("\$new['{$match[1]}']{$match[2]} = $value;"); 
    } else { 
     $new[$key] = $value; 
    } 
} 

也許或多或少的可讀性eval()

 eval('$new["'.$match[1].'"]'.$match[2].' = $value;'); 
+1

OP希望將字符串'scattrmcb [4]'轉換爲類似'[scattrmcb] [4]''的數組。你的代碼對此有幫助嗎? –

+0

@u_mulder:是的,編輯過..... – AbraCadaver

+0

事實上,你的第一個答案對我更好。只是省略了來自子數組的key =>值對的需要,而且我都很好。感謝隊友,這真的幫了我很多。 – Abhik

0

你需要更多的邏輯:

<?php 
$datas = [ 
    ['name'=>'scattr', 'value'=>250], 
    ['name'=>'scattrmcb[1]', 'value'=>10], 
    ['name'=>'scattrmcb[4]', 'value'=>40] 
]; 

$new = array(); 

foreach ($datas as $data) { // $datas as being the multidimensional array. 
    // 'scattrmcb' is special so handle it here 
    if(substr($data['name'], 0, 9) === 'scattrmcb'){ 
     // Set the 'scattrmcb' index 
     if(!isset($new[substr($data['name'], 0, 9)])){ 
      $new[substr($data['name'], 0, 9)] = []; 
     } 

     // Use preg_replace to set a sub-array to the value between [] 
     $new[substr($data['name'], 0, 9)][preg_replace("/[^0-9]/", "", $data['name'])] = $data['value']; 
    } 
    else{ 
     $new[$data['name']] = $data['value']; 
    } 
} 

print_r($new);