Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多维数组中不同值的计数_Php - Fatal编程技术网

Php 多维数组中不同值的计数

Php 多维数组中不同值的计数,php,Php,我真的很难弄明白这一点 我有一个PHP数组,如下所示: $info = array(); $info[0] = array( 'car' => 'Audi', 'previous_car' => 'BMW' ); $info[1] = array( 'car' => 'Audi', 'previous_car' => 'Seat' ); $info[2] = array( 'car' => 'Audi',

我真的很难弄明白这一点

我有一个PHP数组,如下所示:

$info = array();

$info[0] = array(
    'car' => 'Audi',
    'previous_car' => 'BMW'
    );

$info[1] = array(
    'car' => 'Audi',
    'previous_car' => 'Seat'
    );

$info[2] = array(
    'car' => 'Audi',
    'previous_carg' => 'BMW'
    );

$info[3] = array(
    'car' => 'BMW',
    'previous_car' => 'BMW'
    );

$info[4] = array(
    'car' => 'Ford',
    'previous_car' => 'Seat'
    );
Array (
    car [
        'Audi' => 3,
        'BMW' => 1,
        'Ford' => 1
    ],
    previous_car [
        'BMW' => 3,
        'Seat' => 2
    ]

);
我需要对其进行排序,结果如下所示:

$info = array();

$info[0] = array(
    'car' => 'Audi',
    'previous_car' => 'BMW'
    );

$info[1] = array(
    'car' => 'Audi',
    'previous_car' => 'Seat'
    );

$info[2] = array(
    'car' => 'Audi',
    'previous_carg' => 'BMW'
    );

$info[3] = array(
    'car' => 'BMW',
    'previous_car' => 'BMW'
    );

$info[4] = array(
    'car' => 'Ford',
    'previous_car' => 'Seat'
    );
Array (
    car [
        'Audi' => 3,
        'BMW' => 1,
        'Ford' => 1
    ],
    previous_car [
        'BMW' => 3,
        'Seat' => 2
    ]

);
我需要计算同一个键中某个值的不同出现次数,但搜索是在两个数组上进行的。我试图使用array\u value\u count(),但在多维数组上效果不佳

我试图避免循环,因为如果数组很大,它可能会被过度杀死


我将非常感谢您的帮助。

如果您正在运行PHP 5.5,您可以使用:

$newArray = array(
    'car' => array_count_values(array_column($info, 'car')),
    'previous_car' => array_count_values(array_column($info, 'previous_car'))
);
var_dump($newArray);
适用于5.5之前的PHP版本

$newArray = array(
    'car' => array_count_values(
        array_map(
            function($value) {
                return $value['car'];
            },
            $info
        )
    ),
    'previous_car' => array_count_values(
        array_map(
            function($value) {
                return $value['previous_car'];
            },
            $info
        )
    )
);
var_dump($newArray);

您可以编写一个函数来对数据进行排序,但现在请检查以下内容:
以下是可能对您有所帮助的内容:

$returnArray = array('car' => NULL, 'previous_car' => NULL);

foreach($info as $newInfo) {
    $returnArray['car'][] = $newInfo['car'];
    $returnArray['previous_car'][] = $newInfo['previous_car'];
}

$ret['car'] = array_count_values($returnArray['car']);
$ret['previous_car'] = array_count_values($returnArray['previous_car']);

var_dump($ret);
这将返回:

array (size=2)
  'car' => 
    array (size=3)
      'Audi' => int 3
      'BMW' => int 1
      'Ford' => int 1
  'previous_car' => 
    array (size=2)
      'BMW' => int 3
      'Seat' => int 2

以一种更面向对象的方式,您可以按如下方式解决它

$values = new ArrayObject();
$iterator = new RecursiveArrayIterator($info);
iterator_apply($iterator, 'countDistinct', array($iterator, $values));

function countDistinct($iterator, $values) {
    while ( $iterator -> valid() ) {
        if ( $iterator -> hasChildren() ) {
            countDistinct($iterator -> getChildren(), $values);
        } else {
            if (!$values->offsetExists($iterator->key())) {
                $values->offsetSet($iterator->key(), new ArrayObject());
            }

            if (!$values->offsetGet($iterator->key())->offsetExists($iterator->current())) {
                $values->offsetGet($iterator->key())
                    ->offsetSet($iterator->current(), 1);
            } else {
                $values->offsetGet($iterator->key())
                    ->offsetSet($iterator->current(),
                $values->offsetGet($iterator->key())->offsetGet($iterator->current()) + 1);
            }
        }

        $iterator -> next();
    }
}
当然,在本例中,您不会避免循环。但是使用ArrayObject和RecursiveArrayIterator,您将拥有一些内存和性能优势


此操作的结果将与您的预期结果完全匹配,您可以使用ArrayObject的getIterator()函数轻松迭代此结果。

此问题将对您有所帮助,这里已经有人问过了。。不幸的是,服务器正在运行PHP5.4.9转储$newArray只提供:
code
array(2){[“car”]=>array(0){}[“previous_car”]=>array(0){}
code
很好的解决方案。谢谢,$returnArray的var_dump只会导致
code
array(2){[“car”]=>array(0){}[“previous_car”]=>array(0){}更新了答案。希望有帮助!好极了!非常感谢你!