WedX - журнал о программировании и компьютерных науках

Удалите повторяющиеся значения, имеющие один и тот же ключ в многомерном массиве, и сохраните уникальные значения в другом массиве.

у меня есть массив

Array([0]=>Array
            (
               [a]=>'street1'
               [b]=>'area1'
               [c]=>'zip1'
            )
      [1]=>Array
            (
               [a]=>'street2'
               [b]=>'area1'
               [c]=>'zip1'
            (

      [2]=>Array
            (
               [a]=>'street3'
               [b]=>'area1'
               [c]=>'zip2'
            (
      )

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

Array([a]=>Array('street1','street2','street3')
      [b]=>Array('area1')
      [c]=>Array('zip1','zip2')
      )

Я попытался сделать это с помощью слияния массивов и нескольких циклов foreach, и это действительно запутало. Может ли кто-нибудь помочь мне с этим.

29.05.2015

Ответы:


1

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

$input = array(
    array('a'=>'street1', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street2', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street3', 'b'=>'area1', 'c'=>'zip2')
);

$result = array();
foreach($input as $address) {
    foreach($address as $field=>$value) {
        if (!isset($result[$field])) $result[$field] = array();
        $result[$field][] = $value;
    }
}

foreach($result as $key=>$values) {
    $result[$key] = array_unique($values);
}

Вы можете проверить, существует ли значение, прежде чем добавлять его вместо использования array_unique впоследствии. В зависимости от размера данных это будет экономить память.

i.e:

$result = array();
foreach($input as $address) {
    foreach($address as $field=>$value) {
        if (!isset($result[$field])) $result[$field] = array();

        if (!in_array($value, $result[$field])) {
            $result[$field][] = $value;
        }
    }
}
29.05.2015

2
[akshay@localhost tmp]$ cat test.php
<?php

$array = array( array('a'=>'street1','b'=>'area1','c'=>'zip1'),array('a'=>'street2','b'=>'area1','c'=>'zip1'),array('a'=>'street3','b'=>'area1','c'=>'zip2'));

foreach($array as $v)
{
    foreach($v as $p => $q)
    {
        if(!isset($output[$p]))
        {
            $output[$p][] = $q;
            continue;
        }

        if(!in_array($q,$output[$p]))
            $output[$p][] = $q;
    }
}

// Input
print_r($array);

//Output
print_r($output);
?>

Вывод

[akshay@localhost tmp]$ php test.php
Array
(
    [0] => Array
        (
            [a] => street1
            [b] => area1
            [c] => zip1
        )

    [1] => Array
        (
            [a] => street2
            [b] => area1
            [c] => zip1
        )

    [2] => Array
        (
            [a] => street3
            [b] => area1
            [c] => zip2
        )

)
Array
(
    [a] => Array
        (
            [0] => street1
            [1] => street2
            [2] => street3
        )

    [b] => Array
        (
            [0] => area1
        )

    [c] => Array
        (
            [0] => zip1
            [1] => zip2
        )

)
29.05.2015

3

Считай это входом

$input = [
    ['a' => 'street1', 'b' => 'area1', 'c' => 'zip1'],
    ['a' => 'street2', 'b' => 'area1', 'c' => 'zip1'],
    ['a' => 'street3', 'b' => 'area1', 'c' => 'zip2']
];

Использование array_walk()

array_walk($input, function($v) use(&$final){
    array_walk($v, function($val, $key, $v) use(&$final){
        $final[$key][] = $v[$key];
    }, $v);
});

$final = array_map('array_values', array_map('array_unique', $final));

Использование foreach

foreach($input as $array)
{
    foreach($array as $key => $val)
    {
        $final[$key][] = $array[$key];
    }
}   unset($array, $key, $val);

$final = array_map('array_values', array_map('array_unique', $final));

Ваш вывод $final в обоих случаях,

array (size=3)
  'a' => 
    array (size=3)
      0 => string 'street1' (length=7)
      1 => string 'street2' (length=7)
      2 => string 'street3' (length=7)
  'b' => 
    array (size=1)
      0 => string 'area1' (length=5)
  'c' => 
    array (size=2)
      0 => string 'zip1' (length=4)
      1 => string 'zip2' (length=4)
29.05.2015

4
$arr = array(
    array('a'=>'street1', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street2', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street3', 'b'=>'area1', 'c'=>'zip2')
);

$new = array();
foreach($arr as $a){

    foreach($a as $key=>$value){
        if(array_key_exists($key,$new)){
            if(!in_array($value,$new[$key])){
            array_push($new[$key],$value);
            }
        }
        else{
            $new[$key][] = $value;
        }
    }
}
var_dump($new);

Выход

array(3) {
  ["a"]=>
  array(3) {
    [0]=>
    string(7) "street1"
    [1]=>
    string(7) "street2"
    [2]=>
    string(7) "street3"
  }
  ["b"]=>
  array(1) {
    [0]=>
    string(5) "area1"
  }
  ["c"]=>
  array(2) {
    [0]=>
    string(4) "zip1"
    [1]=>
    string(4) "zip2"
  }
}
29.05.2015
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]