2012-06-26 3 views
0

У меня есть многомерный массив с определенным индексом для каждого массива , чтобы быть более конкретным, у меня есть уникальный ip как индекс и значения в качестве значений.PHP извлекает уникальные элементы из многомерного массива рекурсивно

Я хотел бы извлечь рекурсивно 1 значение из каждого массива, никогда не 2 значения от одного и того же IP-адреса и отобразить группу в виде пакета. Тем не менее, я должен отображать весь набор.

Чтобы быть немного более ясным, я должен извлекать значения из всего набора на основе уникальности IP, каждая партия должна содержать 5 значений, и я должен отображать каждое из значений в списке. Количество IP никогда не является известным значением.

, например, если у меня есть этот массив:

Array 
    (
    [ip] => Array 
    (
     [0] => entry01 


     [1] => entery02 


     [2] => entery03 


     [3] => entery04 

    ) 

[ip] => Array 
    (
     [0] => entery05 


    ) 

[ip] => Array 
    (
     [0] => entery06 


    ) 
) 

Мой конец решительными должен быть чем-то вроде этого:

entery01, entery05, entery06 

Теперь, пожалуйста, обратите внимание, что мы до сих пор значения entery02-04 в первом массиве , это означает, что после завершения извлечения я должен получить их также.

+0

у вас есть ответы! – buley

ответ

0

Этот ассоциативный массив невозможен - у вас может быть только один ключ ip.

Edit: Предположим, что ip является заполнителем, вот один из способов сделать это: использовать in_array() и добавить в массив результатов, если она не принимает значение true.

<?php 

$begin = array(
    0 => array('entry01', 'entry02', 'entry03'), 
    1 => array('entry01', 'entry04'), 
    2 => array('entry02', 'entry07') 
); 

$results = array(); 
foreach ($begin as $k1 => $subarr) { 
    $count = 0; 
    foreach ($subarr as $k2 => $entry) { 
     if (! in_array($entry, $results) && $count < 1) { 
      $results[] = $entry; 
      $count++; 
     } 
    } 
} 
var_dump($results); 

?> 

$ php unique_items.php 
array(3) { 
    [0]=> 
    string(7) "entry01" 
    [1]=> 
    string(7) "entry04" 
    [2]=> 
    string(7) "entry02" 
} 
+0

'ip' является заполнителем для фактического IP-адреса – ametren

+0

@ametren правильно. – RmH

+0

, независимо от того, какой пример является законным массивом, как есть, поэтому я обновлен с помощью недавно введенного примера – buley

0
$events = array(); 
foreach($data_array as $ip=>$evnt_array){ 
    foreach($evnt_array as $event){ 
    if(!in_array($event,$events)){ 
     $events[] = $event 
    } 
    } 
} 

Per комментарий

$events = array(); 
foreach($data_array as $ip=>$evnt_array){ 
    foreach($evnt_array as $event){ 
    if(!in_array($event,$events)){ 
     $events[] = $event 
     break; 
    }else{ 
     continue; 
    } 
    } 
} 

В этом примере мы возьмем только первый элемент, если он является уникальным, а затем выйти из внутреннего цикла. Если этот первый элемент уже проиндексирован, перейдите к следующему и повторите проверку.

+0

У меня тоже было это решение в один момент на ранней стадии, но я прочитал: «Я хотел бы извлечь рекурсивно 1 значение формы каждого массива, а не 2 значения из один и тот же IP-адрес и отображать кучу в виде пакета. Тем не менее, я должен отображать весь набор ». Я не знаю, насколько я понимаю. – buley

+0

Просто хотите получить первый элемент от каждого, и только если он уникален? Я могу его отредактировать. – DeaconDesperado

+0

Не мой вопрос, но да, я должен был внести изменения для учетной записи для этого тоже http://stackoverflow.com/a/11214134/317937 – buley

-1

Я думаю, что что-то, как это должно работать

$myInputArray = // your array up there 
$myOutputArray = array(); 
foreach($myInputArray as $ip) { 
    foreach($ip as $value) { 
    if(!in_array($value,$myOutputArray)){ 
     $myOutputArray[] = $value; 
    } 
    break; 
    } 
} 

EDIT: К сожалению, я пропустил эту линию:

Я хотел бы, чтобы извлечь рекурсивно 1 значение формируют каждый массив, никогда 2 значений из тот же IP-адрес и отображать группу в виде пакета. Тем не менее, я должен отображать весь набор.

Ответ обновлен

+0

Прежде всего, спасибо за ваш быстрый ответ. К сожалению, я пробовал этот точный мир кода сам и его не принимал, его доза не различала IP. А что касается вашего вопроса, нетрудно сказать, что я не могу взять дубликаты. – RmH

+0

Хорошо, я добавил оператор if, заимствованный из приведенного ниже ответа. Однако какой результат вы получаете, когда запускаете код, подобный тому, что я вам дал? – ametren

+0

Я получаю ни один смешанный список, при этом некоторые значения отсутствуют. – RmH

-1

Я думаю, что вы ищете цикл по каждому элементу. Это просто захватывает первый.

foreach ($arrayName as $ip){ 
    echo $ip[0]; 
} 

Я пропустил какой-либо вопрос. Вышеприведенная часть больше не является действительным ответом в моем сознании. Я думаю, что ассоциативный массив с ключом будет ip, а значение ip будет работать. Проверьте массив для ключа ip, если он не существует, добавьте его, если он существует, удалите этот ключ из массива. Если длина массива равна 5, вы можете остановиться.

+0

Это будет просто напечатать первый элемент каждого массива. В вопросе задаются уникальные значения из многомерного массива. – sachleen

+0

@sachleen Точно! благодаря! :) – RmH

+0

Прежде всего, спасибо всем вам за большой интерес к моему вопросу, к сожалению, хотя я все эти рекомендации уже не повезло. Дело в том, что оно должно быть рекурсивным, И оно должно отображать комбинацию не более 5 записей на каждой итерации. – RmH

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