2012-02-16 1 views
1

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

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).

ответ

4

Если я правильно понимаю ваш вопрос, я думаю, что 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 
     ) 
) 
+0

его полезный приятель, спасибо большое! –

-1

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

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

$arr = $tmp['ModelName']; 
+0

Вам не нужно добавить запрос «содержать»! –

+0

Я всегда использую 'contains = array()' - но в любом случае он должен добавить его, если уровень 'recursive' по умолчанию больше -1! – mark

+1

Нет, структура массива не такая. – ale

3

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

function reformArray($array,$modelName) 
{ 

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

    return $newArr; 
} 

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

+0

его полезный приятель, спасибо большое! –

1
$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' 
      ) 
     ) 
    ) 
); 

RUN ЭТА СНЯТЬ MODEL NAME USER

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

В CakePHP 2:

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

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

foreach ($data as $k => &$t) { 
    $t = $t['Model'] 
} 
0

Это будет намного проще с 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 
      ) 

    ) 
Смежные вопросы