php中的array_unique,数组中有子数组

时间:2015-12-15 07:36:39

标签: php array-unique

如何为此数组使用array_unique函数 `

$mon  = array('9:00AM - 11:00AM','1:00pm-6pm');
$tue  = array('8:00AM - 11:00AM','12:00pm-6pm');
$wed  = array('9:00AM - 11:00AM','1:00pm-6pm');
$thu  = array('9:00AM - 11:00AM','1:00pm-6pm');
$fri  = array('9:00AM - 12:00PM','1:00pm-6pm');
$sat  = array('9:00AM - 7:00PM');
$sun  = array('9:00AM - 12:00AM','1:00pm-6pm');

$a=array($mon , $tue , $wed , $thu , $fri , $sat , $sun);
print_r(array_unique($a));

3 个答案:

答案 0 :(得分:1)

你必须为多维数组编写自定义函数, 请参考以下功能

function unique_multidim_array($array, $key){
$temp_array = array();
$i = 0;
$key_array = array();

foreach($array as $val){
    if(!in_array($val[$key],$key_array)){
        $key_array[$i] = $val[$key];
        $temp_array[$i] = $val;
    }
    $i++;
}
return $temp_array; }

现在,从您的代码

中调用此函数
 $details = unique_multidim_array($details,'id');

如果您的情况需要将密钥传递为0或1,如

$a=unique_multidim_array($a,0);

答案 1 :(得分:1)

您也可以使用此解决方案:

$schedule = array(
    array('9:00AM - 11:00AM','1:00pm-6pm'),
    array('8:00AM - 11:00AM','12:00pm-6pm'),
    array('9:00AM - 11:00AM','1:00pm-6pm'),
    array('9:00AM - 11:00AM','1:00pm-6pm'),
    array('9:00AM - 12:00PM','1:00pm-6pm'),
    array('9:00AM - 7:00PM'),
    array('9:00AM - 12:00AM','1:00pm-6pm'),
);

$schedule = array_map(function ($item) {
    return json_encode($item);
}, $schedule);

// use array_flip to switch keys and values. By doing it the duplicates will be removed    
$json = '[' . implode(',', array_keys(array_flip($schedule))) . ']';
$schedule = json_decode($json);

var_dump($schedule);

答案 2 :(得分:0)

对于array_unique(),PHP手册PHP manual表示

当且仅当(string)$ elem1 ===(string)$ elem2,即当字符串表示形式相同时,才会使用第一个元素。

因此在内部,比较之前,输入数组的每个元素都将转换为字符串。当您将子数组作为元素时,将其强制转换为字符串将输出“数组到字符串转换”的通知,并返回无用的结果:

var_dump((string)['foo', 'bar']); // string(5) "Array"

幸运的是,为array_unique()建立替代品很容易:

function uniquify(array $arr) {
    return array_reduce(
        $arr,
        function ($carry, $item) {
            if (!in_array($item, $carry)) {
                $carry[] = $item;
            }
            return $carry;
        },
        []
    );
}