重新格式化现有数组以将项目组合在一起

时间:2013-09-13 23:04:09

标签: php arrays multidimensional-array associative-array

我有以下数组:

  Array
(
[0] => Array
    (
        [name] => bss2
        [label] => front
        [text] => just a testing item
    )

[1] => Array
    (
        [name] => bss3
        [label] => front top
        [text] => front top testing item
    )

[2] => Array
    (
        [name] => J334
        [label] => back top
        [text] => masking test back top
    )

[3] => Array
    (
        [name] => J3366
        [label] => back
        [text] => back non mask test 
    )

我想要完成的是检查label = front然后将前面的那些组合在一起然后将它们放在一个大数组中以使它看起来如此:

[approval] => Array(
    [0] => Array(
        [name] => front
        [prev] => Array(
            [0]=>Array(
                [name] => bss2
            )
            [1]=>Array(
                [name] => bss2
            )
        )
    )
    [1] => Array(
         [name] => back
         [prev] => Array( 
            [0]=>Array(
                [name] => J334
            )
            [1]=>Array(
                [name] => J3366
            )
        )
    )
)
到目前为止,我没有太多而且卡住了,但这是我的代码

    foreach($info as $data) {

        if(strtolower(strpos($data['label'], "front") !==false)) {

        } else {

        }

    }

Iv也尝试过使用array_chunk,但是如果有3个元素需要分组或4个

会发生什么
   array_chunk($info, 2);

或者如果订单在前面而第二个回来的情况下会发生什么会发生什么,然后它会将正面和背面组合在一起。

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

这应该这样做,假设唯一的选择是frontback

$result = array(array('name' => 'front', 'prev' => array()),
                array('name' => 'back', 'prev' => array()));

foreach ($info as $data) {
    $i = (strpos(strtolower($data['label']), "front") !== false) 
    $result[$i]['prev'][] = array('name' => $data['name'];    
}

$newinfo = array('approval' => $result;

答案 1 :(得分:0)

我不清楚你究竟在追求什么...如果只是frontback,或者你想要top以及其他任何群体?

方法

无论如何,涵盖大多数情况的一些选项。

仅限正面和背面

这是最简单的,只会检查frontback。如果找到它们,则会根据需要在front中添加back$newArray

$newArray = array(array('front'), array('back')); //The new reformatted array

for($i = 0; $i < count($initialArray); $i++){
    if(strpos($initialArray[$i]['label'], 'front') !== FALSE){//Check if group is front
        $newArray[0]['prev'][] = array('name'=>$initialArray[$i]['name']); //Add to front
    }
    if(strpos($initialArray[$i]['label'], 'back') !== FALSE){//Check if group is back
        $newArray[1]['prev'][] = array('name'=>$initialArray[$i]['name']); //Add to back
    }
}

预定义组

这个有点复杂,会搜索$groups中找到的所有群组。以下代码仅显示frontback,但您也可以添加top或其他任何内容。

$groups = array('front', 'back');   //Groups to search for e.g. front, back, and top
$newArray = array(); //The new reformatted array

for($i = 0; $i < count($initialArray); $i++){
    foreach($groups as $group){
        if(strpos($initialArray[$i]['label'], $group) !== FALSE){//Check if group is in label
            $groupKey = array_search($group, $groups); //Search for the key in $groups
            $newArray[$groupKey]['prev'][] = array('name'=>$initialArray[$i]['name']); //Add to relevant group
        }
    }
}

自动

这是最先进的代码,它会自动搜索并添加在数组中找到的新组。它也是完全自动化的,所以你要做的就是将它指向正确的数组。

$groups = array();   //Index of groups like: top, front, and back
$newArray = array(); //The new reformatted array

for($i = 0; $i < count($initialArray); $i++){
    $possibleGroups = explode(' ', strtolower($initialArray[$i]['label'])); //Get list of applicable groups

    foreach($possibleGroups as $newGroup){
        if(!in_array($newGroup, $groups)){ //If group doesn't already exist in $groups add it
            $groups[] = $newGroup;
            $newArray[] = array('name'=>$newGroup, 'prev'=>array());
        }

        $groupKey = array_search($newGroup, $groups); //Search for the key in $groups
        $newArray[$groupKey]['prev'][] = array('name'=>$initialArray[$i]['name']); //Add to relevant group
    }
}

测试数组

上述代码已使用以下数组进行测试...

$initialArray = array(
    array(
            'name' =>'bss2',
            'label'=>'front',
            'text' =>'sometihng...'
        ),
    array(
            'name' =>'bss3',
            'label'=>'front top',
            'text' =>'sometihng...'
        ),
    array(
            'name' =>'j334',
            'label'=>'back top',
            'text' =>'sometihng...'
        ),
    array(
            'name' =>'j3366',
            'label'=>'back',
            'text' =>'sometihng...'
        )
);

示例输出

使用上面的测试数组输出第三种方法(自动化)。

array (
  0 => 
  array (
    'name' => 'front',
    'prev' => 
    array (
      0 => 
      array (
        'name' => 'bss2',
      ),
      1 => 
      array (
        'name' => 'bss3',
      ),
    ),
  ),
  1 => 
  array (
    'name' => 'top',
    'prev' => 
    array (
      0 => 
      array (
        'name' => 'bss3',
      ),
      1 => 
      array (
        'name' => 'j334',
      ),
    ),
  ),
  2 => 
  array (
    'name' => 'back',
    'prev' => 
    array (
      0 => 
      array (
        'name' => 'j334',
      ),
      1 => 
      array (
        'name' => 'j3366',
      ),
    ),
  ),
)