簡體   English   中英

根據其值對2D數組進行分組

[英]Grouping a 2D array according to its values

我一直試圖讓一些顯示邏輯表現並保持它所屬的位置,並且代碼變成了一個有趣的小問題,這對於制定一個通用的解決方案來說是件好事。

忍受我,它看起來像一堵文字牆,但我試圖用簡單的示例數據很好地格式化它,所以在快速瀏覽之后它應該是可以理解的。

如果由於某種原因,整個事情是一個可怕的想法,我需要在我對眾神造成侮辱之前說出來。

從這樣的數據開始,例如:

$data = array(

    array(
        'name' => 'Dave',
        'age'  => '21',
        'city' => 'New York',
    ),
    array(
        'name' => 'Mike',
        'age'  => '19',
        'city' => 'Chicago',
    ),
    array(
        'name' => 'John',
        'age'  => '21',
        'city' => 'Chicago',
    ),
    array(
        'name' => 'Matt',
        'age'  => '19',
        'city' => 'New York',
    ),
    array(
        'name' => 'Luke',
        'age'  => '21',
        'city' => 'New York',
    ),

);

使用一組鍵名來對數據進行分組,例如

$groups = array('city', 'age);

然后數據變為:

$data = array(

    'New York' => array(
        '21' => array(
            array(
                'name' => 'Dave',
                'age'  => '21',
                'city' => 'New York',
            ),
            array(
                'name' => 'Luke',
                'age'  => '21',
                'city' => 'New York',
            ),
        ),
        '19' => array(
            array(
                'name' => 'Matt',
                'age'  => '19',
                'city' => 'New York',
            ),
        ),
    ),
    'Chicago' => array(
        '19' => array(
            array(
                'name' => 'Mike',
                'age'  => '19',
                'city' => 'Chicago',
            ),
        ),
        '21' => array(
            array(
                'name' => 'John',
                'age'  => '21',
                'city' => 'Chicago',
            ),
        ),
    ),
);

當我說“一般解決方案”時,我的意思是我正在嘗試制作可以將事物分組到任何嵌套級別的內容,具體取決於您要求分組的關鍵名稱的數量。

如果我只是知道一些隨機的深奧的PHP語法,感覺就像我可以立即解決的那種問題。 有什么建議? 如果我在此期間弄清楚的話,我會嘗試更新這個。

function group_array($arr, $fields) {

    if(empty($fields) || !is_array($fields)) {
        return $arr;
    }

    $newarr = array(); // so that we always return an array
    $field = array_shift($fields);

    foreach($arr as $val) {
        $newarr[$val[$field]][] = $val;
    }

    foreach(array_keys($newarr) as $key) {
        // Since we shifted one field off before, this groups by the remaining
        $newarr[$key] = group_array($newarr[$key], $fields);
    }

    return $newarr;
}

我知道這已經過時了,但是當他們來到這里時,他想為其他人發布一個解決方案。

foreach($data as $row) {
     $data_array[$row['city']][] = $row;
}

我原本試圖對對象數組進行排序,因此無論如何我都要編寫它,這是一個可以處理對象的對象,即使它是一個有點hacky的想法

function group_objects($array, $fields)
{
    if (empty($fields) || !is_array($fields)) {
        return $array;
    }

    $newArray = array();
    $field    = array_shift($fields);

    foreach ($array as $object) {
        $key = call_user_func(array($object, 'get' . ucwords($field)));
        $newArray[$key][] = $object;
    }

    foreach (array_keys($newArray) as $key) {
        $newArray[$key] = group_objects($newArray[$key], $fields);
    }

    return $newArray;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM