0

我有以下数组:

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

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

非常感谢您的任何帮助。

4

2 回答 2

0

我不清楚你到底在追求什么……如果只是frontback或者如果你想top和其他任何团体一样?

方法

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

仅正面和背面

这是最简单的,只检查frontand back。如果它找到它们,那么它将根据需要添加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',
      ),
    ),
  ),
)
于 2013-09-14T00:05:38.547 回答
0

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

$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;
于 2013-09-13T23:43:07.007 回答