2016-05-15 74 views
1

是的,這已經通過使用不同的方法被無數次地回答,在大多數情況下,它可以工作,但不適用於我的情況,請允許我解釋。

以鍵值爲基礎的組數組

我從一個CSV文件構建一個數組,這是很容易的部分,困難的部分是,我的是,我必須從第一個數組構建另一個數組,根據一個鍵值對結果進行分組,問題是,這個值是不是一個數組,也不是一個簡單的字符串...
這是從CSV的陣列的示例文件

[0] => Array 
    (
     [key_1] => FOO 
     [cats] => /30/ 
     [key_2] => FTU-1 
    ) 
[1] => Array 
    (
     [key_1] => FOO 
     [cats] => /30/ 
     [key_2] => FTU-2 
    ) 
[2] => Array 
    (
     [key_1] => FOO 
     [cats] => /30/10/ 
     [key_2] => FTU-3 
    ) 
[3] => Array 
    (
     [key_1] => FOO 
     [cats] => /15/ 
     [key_2] => FTU-4 
    ) 
[4] => Array 
    (
     [key_1] => FOO 
     [cats] => /10/ 
     [key_2] => FTU-5 
    ) 
[0] => Array 
    (
     [key_1] => FOO 
     [cats] => /15/ 
     [key_2] => FTU-6 
    ) 

最後數組看起來像此基礎上欄cats

[30] => Array 
     (
      [0] => Array 
       (
        [key_1] => FOO 
        [cats] => /30/ 
        [key_2] => FTU-1 
       ) 
      [1] => Array 
       (
        [key_1] => FOO 
        [cats] => /30/ 
        [key_2] => FTU-2 
       ) 
      [1] => Array 
       (
        [key_1] => FOO 
        [cats] => /30/10/ 
        [key_2] => FTU-3 
       ) 
[15] => Array 
     (
      [0] => Array 
       (
        [key_1] => FOO 
        [cats] => /15/ 
        [key_2] => FTU-4 
       ) 
      [1] => Array 
       (
        [key_1] => FOO 
        [cats] => /15/ 
        [key_2] => FTU-6 
       ) 
[10] => Array 
     (
      [0] => Array 
       (
        [key_1] => FOO 
        [cats] => /30/10/ 
        [key_2] => FTU-3 
       ) 
      [1] => Array 
       (
        [key_1] => FOO 
        [cats] => /10/ 
        [key_2] => FTU-5 
       ) 

我正在尋找這個This answer這是最接近我需要,但沒有工作,這就是爲什麼我要求幫助。

更新:我想我只是解決了它...

foreach($firstarr as $k => $v) { 
    $cats = array_filter(explode('/', $v['cats'])); 
    foreach($cats as $ks=>$vs) { 
    if(stripos($v['cats'], $vs)){ 
     $pp[$vs][] = $v; 
    } 
    } 
} 

看起來很不錯。

回答

0

你可以從explode('/', $item['cats'])[1]關鍵:

$newArray = []; 
foreach($originalArray as $item) { 
    $key = explode('/', $item['cats'])[1]; 
    $newArray[$key][] = $item; 
} 
1

也許你幫助這個代碼:

function arrayByOneKey($array, $keyName) 
{ 
    $result = []; 
    foreach ($array as $item) 
    { 
     $keys = explode('/', (string)$item[$keyName]); 
     foreach($keys as $key) 
     { 
      if($key == '') 
      { 
       continue; 
      } 
      $result[$key][] = $item; 
     } 
    } 
    return $result; 
} 

$array = [ 
    [ 
     'key_1' => 'FOO', 
     'key_2' => 'FTU-1', 
     'cats' => '/15/' 
    ], 
    [ 
     'key_1' => 'FOO', 
     'key_2' => 'FTU-2', 
     'cats' => '/15/' 
    ], 
    [ 
     'key_1' => 'FOO', 
     'key_2' => 'FTU-3', 
     'cats' => '/30/10/' 
    ], 
    [ 
     'key_1' => 'FOO', 
     'key_2' => 'FTU-4', 
     'cats' => '/30/10/0' 
    ] 
]; 

$array = arrayByOneKey($array, 'cats'); 
var_dump($array); 

結果:

array(4) { 
    [15]=> 
    array(2) { 
    [0]=> 
    array(3) { 
     ["key_1"]=> 
     string(3) "FOO" 
     ["key_2"]=> 
     string(5) "FTU-1" 
     ["cats"]=> 
     string(4) "/15/" 
    } 
    [1]=> 
    array(3) { 
     ["key_1"]=> 
     string(3) "FOO" 
     ["key_2"]=> 
     string(5) "FTU-2" 
     ["cats"]=> 
     string(4) "/15/" 
    } 
    } 
    [30]=> 
    array(2) { 
    [0]=> 
    array(3) { 
     ["key_1"]=> 
     string(3) "FOO" 
     ["key_2"]=> 
     string(5) "FTU-3" 
     ["cats"]=> 
     string(7) "/30/10/" 
    } 
    [1]=> 
    array(3) { 
     ["key_1"]=> 
     string(3) "FOO" 
     ["key_2"]=> 
     string(5) "FTU-4" 
     ["cats"]=> 
     string(8) "/30/10/0" 
    } 
    } 
    [10]=> 
    array(2) { 
    [0]=> 
    array(3) { 
     ["key_1"]=> 
     string(3) "FOO" 
     ["key_2"]=> 
     string(5) "FTU-3" 
     ["cats"]=> 
     string(7) "/30/10/" 
    } 
    [1]=> 
    array(3) { 
     ["key_1"]=> 
     string(3) "FOO" 
     ["key_2"]=> 
     string(5) "FTU-4" 
     ["cats"]=> 
     string(8) "/30/10/0" 
    } 
    } 
    [0]=> 
    array(1) { 
    [0]=> 
    array(3) { 
     ["key_1"]=> 
     string(3) "FOO" 
     ["key_2"]=> 
     string(5) "FTU-4" 
     ["cats"]=> 
     string(8) "/30/10/0" 
    } 
    } 
} 

UPDATE

array_filter - 優雅的解決方案但編號爲的類別將被忽略。如果是的話,那麼空($鍵)在週期比array_filter - 因爲它也通過數組元素

+0

這是對我的更新同樣的邏輯,。請參閱代碼中的if($ key ==「」),而是使用array_filter(),它的作用相同,您的答案在更新後發佈了一分鐘,因此不允許我選擇答案只是尚未... – Tanker

+0

array_filter - 優雅的解決方案,但ID爲0的類別將被忽略。 如果是這樣,那麼!empty($ key)在循環中比array_filter更好 - 因爲它也通過數組元素 –

0

這可能是扭曲的變通,但我敢打賭它訣竅:

 <?php 

     $arrResultant = array(); 

     foreach($arr as $intKey=>$arrData){ 
      $stripped = preg_replace("#^\/#", "", $arrData['cats']); 
      $arrParts = preg_split("#\/#", $stripped); 
      $intCat1 = isset($arrParts[0])? $arrParts[0]:null; 
      $intCat2 = isset($arrParts[1])? $arrParts[1]:null; 
      if(!array_key_exists($intCat1, $arrResultant)){ 
       $arrResultant[$intCat1] = array(); 
       if(stristr($arrData["cats"], $intCat1)){ 
        $arrResultant[$intCat1][] = $arrData; 
       } 
      }else{ 
       if(stristr($arrData["cats"], $intCat1)){ 
        $arrResultant[$intCat1][] = $arrData; 
       } 
      } 
      if(!array_key_exists($intCat2, $arrResultant) && !is_null($intCat2)){ 
       $arrResultant[$intCat2] = array(); 
       if(stristr($arrData["cats"], $intCat2)){ 
        $arrResultant[$intCat2][] = $arrData; 
       } 
      }else{ 
       if(stristr($arrData["cats"], $intCat2)){ 
        $arrResultant[$intCat2][] = $arrData; 
       } 
      } 
     } 

     var_dump($arrResultant); 

試試吧,讓我們知道如何去....