2014-01-07 34 views
0

簡短項目說明:我需要從現有陣列輸出特定值以進行標籤式字母導航。導航將多個字母組合成標籤(即「A-C」),然後顯示所有以這些字母開頭的帖子的鏈接。導航由插件創建,所以我需要創建變量來輸出組。使用PHP從現有多維數組的特定值創建一個新陣列

我有什麼:我有一個數組,按照子數組的name鍵按字母順序排序。它看起來像下面的例子:

Array (
    [0] => Array ( 
    ['name'] => 'Alpha' 
    ['link'] => 'http://www.someurl.com' 
)  

    [1] => Array ( 
    ['name'] => 'Alpha2' 
    ['link'] => 'http://www.someotherurl.com' 
)  

    [2] => Array ( 
    ['name'] => 'Beta' 
    ['link'] => 'http://www.someurl.com' 
) 

    [3] => Array ( 
    ['name'] => 'Delta' 
    ['link'] => 'http://www.someotherurl.com' 
) 

    [4] => Array ( 
    ['name'] => 'Zephyr' 
    ['link'] => 'http://www.someurl.com' 
) 
) 

我覺得需要做的:我需要建立5個新的陣列,該組的這些子陣列字母。這意味着,我需要將所有以'A' - 'C'開頭的數組組合到一個數組中,'D' - 'G'正在創建如下:

$a_c = array(
    [0] => Array ( 
    ['name'] => 'Alpha' 
    ['link'] => 'http://www.someurl.com' 
)  
    [1] => Array ( 
    ['name'] => 'Alpha2' 
    ['link'] => 'http://www.someotherurl.com' 
)  
    [2] => Array ( 
    ['name'] => 'Beta' 
    ['link'] => 'http://www.someurl.com' 
) 
); 

$d_g = array(
    [0] => Array ( 
    ['name'] => 'Delta' 
    ['link'] => 'http://www.someotherurl.com' 
) 
); 
$h_l = array(); 
$m_r = array(); 
$s_t = array(); 
$u_z = array(
    [0] => Array ( 
    ['name'] => 'Zephyr' 
    ['link'] => 'http://www.someurl.com' 
) 
); 

如果諸如[5] => Array (['name'] => 'Kappa' ['link'] => 'http://www.someurl.com')被添加到第一陣列的新數組值,它將被添加到在$h_l變量陣列。

有誰知道如何或如果這可以做?

+1

你到目前爲止嘗試過什麼? –

+0

@almo do:我還沒有嘗試太多...我真的不知道要嘗試什麼,甚至不知道要尋找什麼來幫助我弄清楚。我已經看到了將數組分成單獨的字母(意味着像'A''B''C'而不是'A-C'這樣的導航結構),但沒有像我需要的那樣。關於我能看到什麼的任何想法? – Baerkins

回答

1

下面是使用的最終輸出陣列,而不是許多不同範圍的陣列的一種方法。

循環遍歷原始數組,確定第一個字母落入哪個預定義範圍,將當前條目添加到最終輸出數組的相應範圍。

// define ranges 
$ranges=array(
    'A-C'=>range('A','C'), 
    'D-G'=>range('D','G'), 
    'H-K'=>range('H','K'), 
    'L-O'=>range('L','O'), 
    'P-S'=>range('P','S'), 
    'T-W'=>range('T','W'), 
    'X-Z'=>range('X','Z') 
); 

// build final array with each entry in its appropriate range 
$final=array(); 
foreach ($data as $item) { 
    $first_letter=strtoupper(substr($item['name'],0,1)); 
    foreach ($ranges as $label => $range) { 
     if (in_array($first_letter,$range)) { 
      $final[$label][]=$item; 
      break; 
     } 
    } 
} 

// output the final array 
echo"<pre>".print_r($final,true)."</pre>"; 

這裏是輸出:

Array 
(
    [A-C] => Array 
     (
      [0] => Array 
       (
        [name] => Alpha 
        [link] => http://www.someurl.com 
       ) 

      [1] => Array 
       (
        [name] => Alpha2 
        [link] => http://www.someotherurl.com 
       ) 

      [2] => Array 
       (
        [name] => Beta 
        [link] => http://www.someurl.com 
       ) 

     ) 

    [D-G] => Array 
     (
      [0] => Array 
       (
        [name] => Delta 
        [link] => http://www.someotherurl.com 
       ) 

     ) 

    [X-Z] => Array 
     (
      [0] => Array 
       (
        [name] => Zephyr 
        [link] => http://www.someurl.com 
       ) 

     ) 

) 

http://phpfiddle.org/main/code/w06-sc5

+0

感謝您的幫助,這工作得很好! – Baerkins

0

如果確定哪些值進入哪個數組只是名稱的標準,是否有什麼理由不能只用foreach()和模式匹配第一個字符來遍歷主數組?或者,您可以使用substr()將第一個字符保存到變量中,然後在switch()測試中與此匹配。如果它純粹是一對一的安排(即你對字母表中的每個字母都有不同的數組),那麼你可以使用一個動態命名的變量來進行關聯。

0

好的,我寫下了我的想法。使用$$我將訪問參數化的變量名稱。值(例如$ a_c,$ d_f,ecc ...)是從我根據實際的「name」參數獲得的信息開始生成的。

變量名是:

我得到實際的[「名稱」]值(與SUBSTR)的首個字母。用ord()我得到了相應的ascii值。

劃分/ 3並乘以3,我得到它所屬的「字母組」的第一個字母(例如:如果第一個字母是「B」,我會得到「 a_c「)。

該值+2是最後一個字母。

我附加了這兩個信息,回到字符串chr()

我沒有在所有測試,這裏是一個例子的僞代碼:

foreach ($myarray as $value) 
{ 
    //finding the name of the variable. the variable name is derived by the letter of the actual value["name"]. the last letter is the first + 2. the name is divided by an underscore. 
    $first_letter = intval((substr(ord($value["name"], 0, 1)) - ord('A'))/3)*3 + ord('A'); 
    $last_letter = $first_letter + 2; 
    $var_name = chr($first_letter)."_".chr($first_letter); 
    if (!isset($$var_name)) 
     $$var_name = array(); 
    $$var_name[] = $value; 
} 
0

試試這個功能。這個函數由兩個參數組成,一個是你想要搜索的字母,另一個是源數組。

function getNewArray($letter='A',$arr){ 
    if(!is_array($arr)) return; 
    $result=array(); 
    foreach($arr as $a){ 
    if(strtolower(trim($a['name'][0])) === strtolower($letter)){ 
      $result[] = $a; 
    } 
    } 
    return $result; 
} 

//此函數返回一個名稱以字母m開頭的數組。第一個參數是NOT區分大小寫 getNewArray('M',$array); //這裏$ array是您的源數組。

相關問題