0

並べ替える必要がある多次元配列があります。

最初に LEVEL を考慮し、次に SECTION を考慮して、SECTION が前の要素の ID と等しくなるように、配列を並べ替える必要があります。

誰かが私を助けることができますか?ありがとう。配列は次のとおりです。

Array
(
    [0] => Array
        (
            [LEVEL] => 1
            [ID] => 1_1
            [SECTION] => _
        )
    [1] => Array
        (
            [LEVEL] => 1
            [ID] => 1_2
            [SECTION] => _
        )
    [2] => Array
        (
            [LEVEL] => 2
            [ID] => 2_1
            [SECTION] => 1_1
        )
    [3] => Array
        (
            [LEVEL] => 2
            [ID] => 2_2
            [SECTION] => 1_2
        )
    [4] => Array
        (
            [LEVEL] => 3
            [ID] => 3_1
            [SECTION] => 2_1
        )
    [5] => Array
        (
            [LEVEL] => 3
            [ID] => 3_2
            [SECTION] => 2_2
        )

そして、ここに私が必要とする結果があります:

Array
(
    [0] => Array
        (
            [LEVEL] => 1
            [ID] => 1_1
            [SECTION] => _
        )
    [2] => Array
        (
            [LEVEL] => 2
            [ID] => 2_1
            [SECTION] => 1_1
        )
    [4] => Array
        (
            [LEVEL] => 3
            [ID] => 3_1
            [SECTION] => 2_1
        )
    [1] => Array
        (
            [LEVEL] => 1
            [ID] => 1_2
            [SECTION] => _
        )
    [3] => Array
        (
            [LEVEL] => 2
            [ID] => 2_2
            [SECTION] => 1_2
        )
    [5] => Array
        (
            [LEVEL] => 3
            [ID] => 3_2
            [SECTION] => 2_2
        )
4

3 に答える 3

1

間違っている場合は訂正してください。ただし、並べ替えに必要なすべての情報が ID に含まれているようです。グループはアンダースコアに続く数字に含まれ、レベルはその前の数字に含まれます。したがって、順序は、これらの数値の順序を逆にして、自然順序の文字列比較を実行することで決定できます。

1_1, 2_1, 3_1, 4_1, 1_2, 2_2, 3_2, 1_3, 2_3, 3_3, 4_3, etc.

なります:

1-1, 1-2, 1-3, 1-4, 2-1, 2-2, 2-3, 3-1, 3-2, 3-3, 3-4, etc.

したがって、初期配列が呼び出された場合$arr:

$ord = array_map(function($a) {return $a['ID'];}, $arr);
$ord = preg_replace('/(\d+)_(\d+)/', '$2-$1', $ord);
array_multisort($ord, SORT_NATURAL, $arr);

PHP 5.5 を使用している場合:

$ord = preg_replace('/(\d+)_(\d+)/', '$2-$1', array_column($arr, 'ID'));
array_multisort($ord, SORT_NATURAL, $arr);
于 2013-08-14T10:42:39.520 に答える
0

私は最終的にこの方法で解決しました。これは最速のソリューションではありませんが、少なくとも必要に応じて機能します

        $i=0;
        foreach ($polozky as $id => $polozka) 
        {
          if ($polozka["LEVEL"] == 1) 
          {
            $i++;
          }
        }

        $j=0;
        foreach ($polozky as $id => $polozka) 
        {
          if ($polozka["LEVEL"] == 2) 
          {
            $j++;
          }
        }

        $k=0;
        foreach ($polozky as $id => $polozka) 
        {
          if ($polozka["LEVEL"] == 3) 
          {
            $k++;
          }
        }

        $stack = array();
        for($l = 0; $l < $i; ++$l)
        {
          array_push($stack, $polozky[$l]);
          $id1 = $polozky[$l]["ID"];

           for($m = 0; $m < $j+$i; ++$m)
            {
              if($polozky[$m]["SECTION"] == $id1)
              {
               array_push($stack, $polozky[$m]);

                $id2 = $polozky[$m]["ID"];
                for($n = 0; $n < $k+$j+$i; ++$n)
                {
                  if($polozky[$n]["SECTION"] == $id2)
                  {
                    array_push($stack, $polozky[$n]);
                  }
                }
              }
            } 
        }
于 2013-08-15T06:59:06.643 に答える
0

あなたの質問に取り組むのは面白かったです.あなたのクエリで私の以下の解決策をチェックしてください.私にとってはうまくいきます.

$arrData=array(
            array(
                'LEVEL'=>1,
                'ID'=>'1_1',
                'SECTION'=>''                       
                ),

            array(
                    'LEVEL'=>'3',
                    'ID'=>'3_1',
                    'SECTION'=>''
            ),
            array(
                    'LEVEL'=>'3',
                    'ID'=>'3_2',
                    'SECTION'=>''
            ),
            array(
                    'LEVEL'=>2,
                    'ID'=>'2_1',
                    'SECTION'=>''
            ),

        array(
                'LEVEL'=>1,
                'ID'=>'1_2',
                'SECTION'=>''
        ),
        );

$arrLevels=array();
foreach($arrData as $key=>$val)
{
    if(!in_array($val['LEVEL'], $arrLevels))
    {
        $arrLevels[]=$val['LEVEL'];
    }
}

 sort($arrLevels);

$arrDataNew=array();
$arrSortIndexes=array();
do
{
    foreach ($arrLevels as $level)
    {
        //array_walk($arrData, 'sort_data',$level,$arrSortIndexes,$arrData);
        $arrCurrentLevel=array();
        foreach($arrData as $key=>$dataC)
        {
            if($dataC['LEVEL']==$level)
            {
                $arrCurrentLevel[intval(end(explode('_',$dataC['ID'])))]=$key;
            }
        }
        if(sizeof($arrCurrentLevel)>0)
        {
            $keyOfArrData=$arrCurrentLevel[min(array_keys($arrCurrentLevel))];
            $arrDataNew[]=$arrData[$keyOfArrData];
            unset($arrData[$keyOfArrData]);
        }


    }

}while(sizeof($arrData)>0);

print_r($arrDataNew);
于 2013-08-14T10:00:40.500 に答える