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 
    )

)

私が達成したいのは、ラベル=フロントであるかどうかを確認してから、フロントと同じものをグループ化し、バックと同じものをすべて1つの大きな配列にグループ化して、次のようにすることです。

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

または、1 つが前面で 2 つ目が背面で順序が異なる場合、前面と背面が結合されます。

どんな助けでも大歓迎ですありがとう。

4

2 に答える 2

0

あなたが何を求めているのか正確にはわかりません...もしそれがfrontand backor if you wanttopであり、他のグループも同様ですか?

メソッド

とにかく、ほとんどの場合をカバーするいくつかのオプションがあります。

表裏のみ

これは最も単純で、 と をチェックするだけfrontです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ます。以下のコードはfrontandのみを示してbackいますが、たとえば、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...'
        )
);

出力例

上記のテスト配列を使用した 3 番目のメソッド (自動化) の出力。

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 に答える