重新设置现有数组的格式以将项目分组在一起


reformat existing array to group items together

我有以下数组:

  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 
    )

我想完成的是检查标签是否 = 正面,然后将带有正面和背面相同的那些组合在一个大数组中,使其看起来像这样:

[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);

或者,如果顺序不同,一个在前面,第二个在后面,会发生什么,然后它将前面和后面组合在一起。

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

这应该可以做到,假设唯一的选择是 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;

我不清楚你在追求什么......如果只是frontback,或者如果您还想要top和任何其他团体?

方法

无论如何,这里有一些选项应该涵盖大多数情况。

仅限正面和背面

这是最简单的,只会检查frontback。如果找到它们,那么它将根据需要以$newArray frontback

$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',
      ),
    ),
  ),
)