2016-03-14 2 views
0

Я использую PHP Глобы функции получить изображения в подкаталогах, и я не знаю, сколько файлов существуют в каждом каталогеслияние массивы с одинаковым значением ключа

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

$arr = []; 
$dir = dirname(__FILE__)."/gulets"; 
$files = glob($dir."/*/*_gulet_o_*"); 
foreach ($files as $file) { 
    $fullname = str_replace($dir."/", "", $file); 
    $name = explode("/", $fullname); 
    $name1 = array('id'=>$name[0],'name'=>$name[1]); 
    $arr[] = $name1; 
} 
header('Content-Type: application/json'); 
echo json_encode($arr); 

[ 
{ 
"id": "10", 
"name": "asdsad_gulet_o_1.jpg" 
}, 
{ 
"id": "10", 
"name": "wqes_gulet_o_10.jpg" 
}, 
{ 
"id": "10", 
"name": "qwsdf_gulet_o_11.jpg" 
}, 
{ 
"id": "10", 
"name": "sdce_gulet_o_12.jpg" 
}, 
{ 
"id": "11", 
"name": "fsdsc_gulet_o_13.jpg" 
}, 
{ 
"id": "11", 
"name": "drfvc_gulet_o_14.jpg" 
}, 
{ 
"id": "12", 
"name": "dsyjhk_gulet_o_15.jpg" 
}, 
. 
. 

и мне нужно изменить его так:

[ 
    { 
    "id": "10", 
    "name1": "asdsad_gulet_o_1.jpg", 
    "name2": "wqes_gulet_o_10.jpg", 
    "name3": "qwsdf_gulet_o_11.jpg" 
    "name4": "sdce_gulet_o_12.jpg" 
    }, 
    { 
    "id": "11", 
    "name1": "fsdsc_gulet_o_13.jpg" 
    "name2": "drfvc_gulet_o_14.jpg" 
    }, 
    { 
    "id": "12", 
    "name1": "dsyjhk_gulet_o_15.jpg" 
. 
. 
+3

вы не можете иметь 2 или более одинаковые имена ключей 'name'. – roullie

+0

@roullie yes Я исправляю ключевые имена в вопросе –

ответ

1

Я думаю, что создание индексов, таких как name1, name2, name3 и т. Д. Не пригодится. Вы должны создать subarray с индексом names и там будут помещены ваши имена. Попробуйте такой код:

<?php 

$array = array(
    array('id'=>1, 'name'=>'qwerty'), 
    array('id'=>2, 'name'=>'asdf'), 
    array('id'=>2, 'name'=>'hjkl'), 
    array('id'=>1, 'name'=>'cvbnm'), 
    array('id'=>1, 'name'=>'yuiop'), 
); 

$groups = array(); 

foreach($array as $singleRow) 
{ 
    if(!isset($groups[$singleRow['id']])) 
     $groups[$singleRow['id']] = array('id'=>$singleRow['id'], 'names'=>array()); 

    $groups[$singleRow['id']]['names'][] = $singleRow['name']; 
} 
$json = json_encode(array_values($groups));  
var_dump($json); 

Он выводит:

[{"id":1,"names":["qwerty","cvbnm","yuiop"]},{"id":2,"names":["asdf","hjkl"]}] 
+0

@Mohammad b, я изменил свой ответ: вместо печати массива печатает json. – aslawin

+0

почему он не сортирует от 1 до 100, это начинается с 10, тогда 101 Мне нужно отсортировать и ключ каждого массива, равный id, чтобы использовать его в angularjs –

0

вместо -

$name1 = array('id'=>$name[0],'name'=>$name[1]); 
$arr[] = $name1; 

вы можете использовать что-то вроде -

$nameKey = 'name' . $name[0]; 
$name1 = array('id'=>$name[0],$nameKey =>$name[1]); 
if (!empty($arr[$name[0]])) { 
    $arr[$name[0]] = $arr[$name[0]] + $name1; 
} 
else { 
    $arr[$name[0]] = $name1; 
} 

и после окончания Еогеасп) цикла (сделать -

$arr = array_values($arr); 
+0

он менял имена ключей, но возвращал только одно значение каждой клавиши –

+0

снова, он не работает и не возвращает одно имя для каждой клавиши –

2

вы хотите что-то вроде этого:

foreach ($arr as $a) { 
    $new_arr[$a['id']]['names'][] = $a['name']; 
} 
+0

это работает хорошо, но почему имена в скобках [] вместо {}? –

+0

@Mohammadb, потому что имена - это массив. – aslawin

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