0

2 つの結合を持つ MySQL クエリの結果は次のとおりです。

Array ( 
[0] => Array ( [place_id] => 1 [place] => Berlin [lat] => 52.519 [lon] => 13.406 [id] => 1 [pname] => Firstschool [typ] => 0 [s_id] => 32 [fac] => history) 

[1] => Array ( [place_id] => 1 [place] => Berlin [lat] => 52.519 [lon] => 13.406 [id] => 1 [pname] => Secondschool [typ] => 0 [s_id] => 33 [fac] => math)

[2] => Array ( [place_id] => 1 [place] => Berlin [lat] => 52.519 [lon] => 13.406 [id] => 1 [pname] => Secondschool [typ] => 0 [s_id] => 33 [fac] => english)
)

データはいくつかの点で冗長です。次のようにする必要があります。

Array ( 
  [Berlin] => Array ( [lat] => 52.519 
                      [lon] => 13.406  
                      [schools] => Array([0]=> Firstschool [1]=>Secondschool)
  )

  [OtherCity] => Array ( ... )
)

まず、これは大丈夫ですか、それともより良い解決策がありますか? =) 2番目..必要な結果を得るために分割する方法。

次のコード スニペットのようなもので試してみましたが、思いどおりに動作しません。

foreach($viewmodel as $item) { 
   $data[$item['place']][] = $item['pname'];
}

結果は次のとおりです。

Array ( [Berlin] => Array ( [0] => Firstschool [1] => Firstschool [2] => Firstschool ))

あまり役に立ちません。;)

私が必要としていることが理解できることを願っています。誰かがこの問題を解決する良いアイデアを持っているかもしれません。

御時間ありがとうございます。

4

4 に答える 4

1

あなたは正しい道を進んでいると思います。もう少し詳細を記入する必要があります。

$cities = Array (
     Array ( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Firstschool', 'typ' => 0, 's_id' => 32, 'fac' => 'history'),
     Array ( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Secondschool', 'typ' => 0, 's_id' => 33, 'fac' => 'math'),
     Array ( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Secondschool', 'typ' => 0, 's_id' => 33, 'fac' => 'english'),
);

// gather the transformed array in a new array 
$out = array();
foreach ($cities as $city) {
    // the first time we see the place
    if (!isset($out[$city['place']])) {
        // copy over what you want to keep
        $out[$city['place']] = array(
            'lat' => $city['lat'],
            'lon' => $city['lon'],
            'schools' => array($city['pname']),
        );
    } // only add $city['pname'] if we don't have it already
    elseif (!in_array($city['pname'], $out[$city['place']]['schools'])) {
        // we already seen this place, just add to the schools
        $out[$city['place']]['schools'][] = $city['pname'];
    }
}

学部の収集の質問については、学校名を配列のキーとして使用して、最上位の配列の「学校」キーに入力し、次のように入力します: (まだ重複をスキップします):

foreach ($a as $city) {
    if (!isset($out[$city['place']])) {
        $out[$city['place']] = array(
            'lat' => $city['lat'],
            'lon' => $city['lon'],
            'schools' => array($city['pname'] => array($city['fac'])),
        );
    } else {
        // for convenience and readability, introducing some variables
        $schools = &$out[$city['place']]['schools'];
        $pname = $city['pname'];
        $fac = $city['fac'];

        // if we didn't see this school yet, add it with it's faculty
        if (!isset($schools[$pname])) {
            $schools[$pname] = array($fac);
        } // if we did see this school before but the faculty is new, add it under the school's key
        else if (!in_array($fac, $schools[$pname])) { 
            $schools[$pname][] = $fac;
        }
    }
}
于 2013-02-17T19:50:20.887 に答える
0

以下は、記述された期待される結果をもたらすはずです

$arr =  array( 
            array(  'place_id'  => 1,  'place'  => 'Berlin',  'lat'  => 52.519,  'lon'  => 13.406,  'id'  => 1,  'pname'  => 'Firstschool',  'typ'  => 0,  's_id'  => 32,  'fac'  => 'history'),
            array(  'place_id'  => 1,  'place'  => 'Berlin',  'lat'  => 52.519,  'lon'  => 13.406,  'id'  => 1,  'pname'  => 'Secondschool',  'typ'  => 0,  's_id'  => 32,  'fac'  => 'history'),
            array(  'place_id'  => 1,  'place'  => 'Berlin',  'lat'  => 52.519,  'lon'  => 13.406,  'id'  => 1,  'pname'  => 'Secondschool',  'typ'  => 0,  's_id'  => 32,  'fac'  => 'history')
            );

$result = array();

foreach($arr as $item) {
    if (array_key_exists($item['place'], $result)) {
        if (!in_array($item['pname'], $result[$item['place']]['schools'])) {
            array_push($result[$item['place']]['schools'], $item['pname']);
        }
    } else {
        $result[$item['place']]['lat'] = $item['lat'];
        $result[$item['place']]['lon'] = $item['lon'];
        $result[$item['place']]['schools'][] = $item['pname'];
    }
}

print_r($result);

どちらを出力するか

 Array (
     [Berlin] => Array
     (
         [lat] => 52.519
         [lon] => 13.406
         [schools] => Array
             (
                 [0] => Firstschool
                 [1] => Secondschool
             )

     )
)
于 2013-02-17T20:05:16.467 に答える
0

そうです、何らかの方法で配列を反復処理する必要があります。私が見た配列から、すべての緯度と経度がすべての学校で同じであると仮定すると、上書きしても問題はありません。それ以外の場合は、追加のロジックが必要です

foreach($viewmodel as $item) {
  $data[$item['place']['lat']=$item['lat'];
  $data[$item['place']['long']=$item['lon'];
  $data[$item['place']['schools'][]=$item['pname'];
}
于 2013-02-17T19:49:50.143 に答える
0

PHP 5.3以降を使用している場合は、ラムダ関数を使用して配列をマップできます

$output = array();

$sort_schools = function($value, $key)
{
    if ( ! is_array($output[$value['place'])
    {
        $output[$value['place'] = array();
    }

    if ( ! isset($output[$value['place']['lat'] && ! isset($output[$value['place']]['lon'])
    {
        $output[$value['place']]['lat'] = $value['lat'];

        $output[$value['place']]['lon'] = $value['lon'];
    }

    $output[$value['place']]['schools'][] = $value['pname'];
};

array_map($sort_schools, $viewmodel);

または、 foreach ループまたは無名関数内のラムダ関数で同様の構造を使用することもできます。

于 2013-02-17T19:50:31.657 に答える