0

この形式の配列があります...

[User] => Array
    (
        [Oct 09] => Array
            (
                [10] => 1
                [8] => 0
                [9] => 0
                [7] => 0
                [6] => 0
            )

        [Oct 10] => Array
            (
                [10] => 0
                [8] => 1
                [9] => 0
                [7] => 0
                [6] => 0
            )

        [Oct 11] => Array
            (
                [10] => 1
                [8] => 0
                [9] => 1
                [7] => 1
                [6] => 1
            )
 )

ループを使用せずに配列を解析して、フォームに変換したい

[User]=>array
( 
  [0] =>array(      
    [date] => OCt 09
    [user_id] => 10
    [attendance] => 1
   )
  [1] =>array(
    [date] => OCt 09
    [user_id] => 8
    [attendance] => 0
   ) 
)

このように、解析に時間がかかるため、foreach や for ループを使用したくありません。組み込みの配列関数を使用したい。私が試したのは

    public function parseAttendance($y){
        return array("date", "user_id", "attendane"); // I want to return something like in this format.
    }
    public function admin_attendance() {
         $result = array_map(array($this, 'parseAttendance'), $arr['User']);
         print_r($result);
         die();
    } 
4

1 に答える 1

1

最初に、入力に基づいて配列を構築できる関数を作成します。

function add_entries(array &$entries, $key, $values) {
    $count = 0;
    foreach ($values as $user_id => $attendance) {
        $count++;
        $entries[] = [
            "date" => $key,
            ...
        ];
    }
    return $count;
}

次に、その関数が入力に対して必要なことを実行するかどうかをテストします。すべて問題なければ、入力配列で使用するだけです。

$input  = obtain_input_array_however_you_do_it();
$output = array();
$count  = 0;

foreach ($input as $key => $values) {
    $count += add_entries($output, $key, $values)
}

確かにこれはそれを解決する 1 つの方法にすぎませんが、いずれにしても役立つことを願っています。ところで、転置の種類を使用することはできません。array_mapまたはarray_walk、ここで 2d 平面で軸を切り替えるためです。つまり、(少なくとも一時的に) 新しい配列を作成する必要があります。そうしないと、変換内で情報が失われます。

また、データが特定のデータ ストアから取得されたものである場合は、後で複雑な変換を行う必要がないように、別の方法でクエリを実行することを検討する必要があります。いずれにせよ、クラス内でさえない場合でも、変換全体を独自の関数に再度ラップします。

于 2013-10-09T08:37:09.100 に答える