2016-02-01 2 views
0

У меня есть javascript, который через ajax передает некоторый контент в контроллер PHP. То, что он проходит это многомерный массив, например:PHP Loop через многомерное в Onedimentional массив

Array 
(
    [0] => Array 
    (
     [a] => - Item 1.1 
    ) 

    [1] => Array 
    (
     [a] => - Item 1.2 
    ) 

    [2] => Array 
    (
     [a] => - Item 1.3 
    ) 

    [3] => Array 
    (
     [b] => - Item 2.1 
    ) 

    [4] => Array 
    (
     [b] => - Item 2.2 
    ) 

    [5] => Array 
    (
     [b] => - Item 2.3 
    ) 

    [6] => Array 
    (
     [b] => - Item 2.4 
    ) 

    [7] => Array 
    (
     [c] => - Item 3.1 
    ) 

    [8] => Array 
    (
     [c] => - Item 3.2 
    ) 
... 
) 

О массиве: 0, 1, 2, и т.д .. автоматически сделаны массива. Буквы a, b, c и т. Д. Являются категориями контента в html, или в основном .classes. Вот некоторые из моих JavaScript для получения дополнительной информации:

$("div[data-category]").each(function() { 

    $cat = $(this).data("category"); 

    $str = $(this).siblings().each(function() { 

     if ($(this).children().hasClass("selected")) { 
      var response = {}; 
      response[$cat] = $(this).children().data("response-text") + "\n"; 
      responses.push(response); 
     ... 
     } 
    }); 
}); 

Моя конечная цель иметь массив, что это

Array (
    [a] => - Item 1.1 \n Item 1.2 \n Item 1.3 
    [b] => - Item 2.1 \n Item 2.2 \n Item 2.3 \n Item 2.4 
    [c] => - Item 3.1 \n Item 3.2 
) 

Так что я мог бы сделать это в моем JavaScript (который я, вероятно, должен), или я могу просто оставьте JavaScript как есть, и создайте петли в PHP для циклического прохождения массива, получите все под-ключи, которые, скажем, a, соедините все a вместе (с новыми строками для каждого человека), затем есть один мерный массив.

Пожалуйста, предложите решение петли PHP или решение JavaScript, которое сделает массив, который я хочу.

===== EDIT =====

Мое решение Ниже

(В разделе ответов)

+0

Обязательно: что вы пробовали? – Populus

+0

Ну, до сих пор я пробовал разные вариации массива, нажимающие на 'ответы' в JS и помещающие« ответы »за пределы оператора' if'. Я все еще больше работаю над решением на стороне JavaScript. – Kenny

ответ

0

Я только что обнаружил супер легко исправить на стороне JavaScript:

Вместо var responses = []; объявлен:

var responses = { 
    a: "", 
    b: "", 
    c: "", 
    d: "", 
    e: "", 
    f: "", 
    g: "" 
}; 

Тогда я просто только доступ к основной массив непосредственно, и используется += продолжать добавлять к конкретному ключу, каждый раз, когда цикл идет:

$("div[data-category]").each(function() { 

    $cat = $(this).data("category"); 

    $str = $(this).siblings().each(function() { 

     if ($(this).children().hasClass("selected")) { 
      // NEW CODE-SOLUTION BELOW 
      responses[$cat] += $(this).children().data("response-text") + "\n"; 
     ... 
     } 
    }); 
}); 

который теперь производит этот формат:

Array (
    [a] => - Item 1.1 
     - Item 1.2 
     - Item 1.3 
    [b] => - Item 2.1 
     - Item 2.2 
     - Item 2.3 
     - Item 2.4 
    [c] => - Item 3.1 
     - Item 3.2 
) 

So лучшее исправление на стороне JavaScript, вместо отправки перепутанного массива на PHP-контроллер и его «исправить» там.

-1

Loop в PHP:

foreach($array as $subArray){ 
    foreach($subArray as $val){ 
     $newArray[] = $val; 
    } 
} 

В другим способом вы можете использовать функцию PHP:

$flat = call_user_func_array('array_merge', $array); 
+0

все еще неправильный .... – Populus

+0

почему? его мой код –

+0

Я не делаю для него код –

0

Это не создает записи, разделенные новой строкой, как вы просили, но я действительно не верю в форматирование жесткого кодирования в данные. Вы можете легко перебирать записи, чтобы создать то, что вы хотите.

var data = [ 
    {a: "Item 1.1"}, 
    {a: "Item 1.2"}, 
    {a: "Item 1.3"}, 
    {b: "Item 2.1"}, 
    {b: "Item 2.2"}, 
    {b: "Item 2.3"}, 
    {b: "Item 2.4"}, 
    {c: "Item 3.1"}, 
    {c: "Item 3.1"}, 
]; 

var result = {}; 

for (var index in data) { 
    for (var item in data[index]) { 
    if (result[item] === undefined) { 
     result[item] = []; 
    } 
    result[item].push(data[index][item]); 
    } 
} 

console.log(result); 

https://jsfiddle.net/oru62n80/

0

Попробуйте это:

$data = [ 
    ['a' => '- Item 1.1'], 
    ['a' => '- Item 1.2'], 
    ['a' => '- Item 1.3'], 
    ['b' => '- Item 2.1'], 
    ['b' => '- Item 2.2'], 
    ['b' => '- Item 2.3'], 
    ['b' => '- Item 2.4'], 
    ['c' => '- Item 3.1'], 
    ['c' => '- Item 3.2'], 
]; 

$uniqueKeys = []; 
$callback = function ($item) use (&$uniqueKeys) { 
    $uniqueKeys[] = array_keys($item)[0]; 
}; 

array_map($callback, $data); 

$uniqueKeys = array_unique($uniqueKeys); 

$combinedData = []; 

foreach ($uniqueKeys as $key){ 
    $combinedData[$key] = implode(' \n ', array_column($data, $key)); 
} 

var_dump($combinedData); 
Смежные вопросы