2017-07-16 94 views
1

减少我有这样阵列与关联数组

$filter_array = Array 
    (
     [0] => Array 
      (
       [fv_id] => 1 
       [fv_value] => Red 
       [filter_id] => 1 
       [filter_name] => Color 
      ) 

     [1] => Array 
      (
       [fv_id] => 2 
       [fv_value] => Blue 
       [filter_id] => 1 
       [filter_name] => Color 
      ) 

    ) 

我想通过具有上阵列的顶部FILTER_NAME过滤器_id这对于所有阵列类似,以减少阵列的阵列。

$newArray = array_reduce($filter_array,function($carry,$item){ 

      $allFilterValues[] = array(
       'fv_id' => $item['fv_id'], 
       'fv_value' => $item['fv_value'], 
      ); 

      $formated_array = array(
       'filter_id' => $item['filter_id'], 
       'filter_name' => $item['filter_name'], 
       'filter_values' => $allFilterValues 
      ); 
      return $formated_array; 
     }); 

但我刚开最后一个数组迭代值上filter_values

Array 
(
    [filter_id] => 1 
    [filter_name] => Color 
    [filter_values] => Array 
     (
      [0] => Array 
       (
        [fv_id] => 2 
        [fv_value] => Blue 
       ) 

     ) 

) 

但我想数组是这样的。

Array 
(
    [filter_id] => 1 
    [filter_name] => Color 
    [filter_values] => Array 
     (
       [0] => Array 
       (
        [fv_id] => 1 
        [fv_value] => Red 
       ), 

       [1] => Array 
       (
        [fv_id] => 2 
        [fv_value] => Blue 
       ) 

     ) 

) 
+0

如果你正在合并'filter_id',为什么你放弃它作为数组键?你确定你有关键的名字吗?在我看来,你应该在每个子组之前使用'filter_id'和'filter_name'作为键。 – mickmackusa

+1

在'array_reduce'回调的每次迭代中,您应该返回'$ carry' –

回答

2

array_reduce回调函数的每次迭代必须返回当前$carry值:

$newArray = array_reduce($filter_array,function($carry,$item){ 
    // create key so as to distinct values from each other 
    $key = $item['filter_id'] . '-' . $item['filter_name']; 

    // check if created key exists in `$carry`, 
    // if not - we init it with some data 
    if (empty($carry[$key])) { 
     $carry[$key] = [ 
      'filter_id' => $item['filter_id'], 
      'filter_name' => $item['filter_name'], 
      'filter_values' => [] 
     ]; 
    } 

    // add values to `filter_values` 
    $carry[$key]['filter_values'][] = [ 
     'fv_id' => $item['fv_id'], 
     'fv_value' => $item['fv_value'], 
    ]; 

    return $carry; 
}, []); 

// if you want to reindex `$newArray` from 0: 
$newArray = array_values($newArray); 

更新:当且仅当在'filter_id''filter_name'$filter_array总是的同样你可以简化你的代码:

$newArray = []; 
$first = true; 
foreach ($filter_array as $item) { 
    if ($first) { 
     $first = false; 
     $newArray = [ 
      'filter_id' => $item['filter_id'], 
      'filter_value' => $item['filter_name'], 
      'filter_values' => [] 
     ]; 
    } 

    $newArray['filter_values'][] = [ 
     'fv_id' => $item['fv_id'], 
     'fv_value' => $item['fv_value'], 
    ]; 
} 
echo'<pre>',print_r($newArray),'</pre>'; 
+0

任何其他数组函数是否比这更容易? – phpnerd

+0

我想没有。但是你可以把它改写成“foreach”。 –

+0

你能告诉我为什么你在array_reduce的回调参数之后通过了[]吗? – phpnerd