Удаление ненужного вложенного индекса в массиве (генерируется Cake PHP) - PullRequest
1 голос
/ 16 февраля 2012

Следующий вопрос можно решить, возможно, изменив мое использование метода find в Cake PHP ИЛИ используя некоторую функцию PHP.Я бы предпочел решить это с помощью Cake, но это не имеет большого значения.У меня есть любой массив, подобный этому:

Array
(
    [0] => Array
        (
            [Model] => Array
                (
                    [id] => 14
                    [foo] => bar
                )

        )

    [1] => Array
        (
            [Model] => Array
                (
                    [id] => 15
                    [foo] => something
                )

        ) .............

Я просто хочу удалить индекс Model и просто использовать числовой.Следующая функция сгенерировала этот массив:

$arr = $this->Model->find('all', array('contain' => false ) );

Мне, вероятно, нужно изменить часть вызова 'contain'.По сути, в дополнение к данным, которые появляются под каждым индексом Model, у меня также есть вторая и третья модель, а contain = false просто ограничивает Cake от получения данных из текущей модели (Model).

Ответы [ 6 ]

4 голосов
/ 18 февраля 2012

Если я правильно понимаю ваш вопрос, я думаю, что функция Set :: объединение CakePHP поможет http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::combine:

$result = Set::combine($your_array, '{n}.Model.id', '{n}.Model.data');

Это приведет к:

 Array
 (
     [14] => Array
         (
             [foo] => bar
         )
     [15] => Array
         (
             [foo] => something
         )
 )
3 голосов
/ 16 февраля 2012

вы должны написать свой собственный кусок кода для изменения массива, вот функция, которая будет делать то, что вы хотите (вы можете улучшить ее)

function reformArray($array,$modelName)
{

    foreach($arr as $key => $value)
    {
        $newArr[] = $arr[$key][$modelName];
    }

    return $newArr;
}

вы должны передать свой массив и имя модели этой функции, и вы получите результат

2 голосов
/ 28 августа 2013
$a = array(
    array(
        'User' => array(
            'id' => 2,
            'group_id' => 1,
            'Data' => array(
                'user' => 'mariano.iglesias',
                'name' => 'Mariano Iglesias'
            )
        )
    ),
    array(
        'User' => array(
            'id' => 14,
            'group_id' => 2,
            'Data' => array(
                'user' => 'phpnut',
                'name' => 'Larry E. Masters'
            )
        )
    ),
    array(
        'User' => array(
            'id' => 25,
            'group_id' => 1,
            'Data' => array(
                'user' => 'gwoo',
                'name' => 'The Gwoo'
            )
        )
    )
);

ЗАПУСТИТЕ ЭТО, ЧТОБЫ УДАЛИТЬ МОДЕЛЬ ИМЯ ПОЛЬЗОВАТЕЛЯ

Set::extract($a, '{n}.User');

ВЕРНУТ ЭТО

$a = array(
        array(

                'id' => 2,
                'group_id' => 1,
                'Data' => array(
                    'user' => 'mariano.iglesias',
                    'name' => 'Mariano Iglesias'
                )

        ),
        array(

                'id' => 14,
                'group_id' => 2,
                'Data' => array(
                    'user' => 'phpnut',
                    'name' => 'Larry E. Masters'
                )

        ),
        array(

                'id' => 25,
                'group_id' => 1,
                'Data' => array(
                    'user' => 'gwoo',
                    'name' => 'The Gwoo'
                )

        )
    );
0 голосов
/ 14 октября 2016

С Object будет намного проще.Замените Array на Object.

На самом деле я столкнулся с той же проблемой с nested array И нашел решение с помощью Set :: map ($ array);

Если вы не хотите model_name как nested array, вы можете предпочесть это решение.

$data = array(
    array(
        "IndexedPage" => array(
            "id" => 1,
            "url" => 'http://blah.com/',
            'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5',
            'get_vars' => '',
            'redirect' => '',
            'created' => "1195055503",
            'updated' => "1195055503",
        )
    ),
    array(
        "IndexedPage" => array(
            "id" => 2,
            "url" => 'http://blah.com/',
            'hash' => '68a9f053b19526d08e36c6a9ad150737933816a5',
            'get_vars' => '',
            'redirect' => '',
            'created' => "1195055503",
            'updated' => "1195055503",
        ),
    )
);

$mapped = Set::map($data);

/* $mapped now looks like: */

    Array
    (
        [0] => stdClass Object
            (
                [_name_] => IndexedPage
                [id] => 1
                [url] => http://blah.com/
                [hash] => 68a9f053b19526d08e36c6a9ad150737933816a5
                [get_vars] =>
                [redirect] =>
                [created] => 1195055503
                [updated] => 1195055503
            )

        [1] => stdClass Object
            (
                [_name_] => IndexedPage
                [id] => 2
                [url] => http://blah.com/
                [hash] => 68a9f053b19526d08e36c6a9ad150737933816a5
                [get_vars] =>
                [redirect] =>
                [created] => 1195055503
                [updated] => 1195055503
            )

    )
0 голосов
/ 14 марта 2016

В CakePHP 2:

$data = $this->Model->find('all');
$data = Set::extract('/Model/.', $data );

Вы можете достичь этого результата также foreach

foreach ($data as $k => &$t) {
    $t = $t['Model']
}
0 голосов
/ 16 февраля 2012

Вы можете сделать это:

$tmp = $this->Model->find('all', array('contain' => false ) );

$arr = $tmp['ModelName'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...