【问题标题】:Filter an array of objects by unique key-value pairs in PHP [closed]通过 PHP 中的唯一键值对过滤对象数组 [关闭]
【发布时间】:2017-09-09 00:18:27
【问题描述】:

如何按值过滤多维数组?我想在这里删除带有重复符号的硬币:

$input =  [
    ["name" => "Bitcoin", "symbol"=> "BTC"],
    ["name" => "Ethereum", "symbol"=> "ETH"],
    ["name" => "Bitcoin Cash", "symbol"=> "BCH"],
    ["name" => "Basic Attention Token", "symbol"=> "BAT"],
    ["name" => "BatCoin", "symbol"=> "BAT"]
]

输出是一个具有独特硬币符号的数组,例如这个。

$output = [
    ["name" => "Bitcoin", "symbol"=> "BTC"],
    ["name" => "Ethereum", "symbol"=> "ETH"],
    ["name" => "Bitcoin Cash", "symbol"=> "BCH"],
    ["name" => "Basic Attention Token", "symbol"=> "BAT"]
]

我试过了

$symbols = array_map(function($coin){
    return $coin['symbol'];
}, $input);


$output = array_filter($input, function($coin) use ($symbols) {
    return in_array($coin['symbol'], $symbols);
});
return $output;

但我仍然列出了 5 个硬币。

【问题讨论】:

  • 添加您尝试过的内容,以便我们为您提供帮助!
  • 老兄...我整个上午都在尝试 array_filter、array_map、array_diff_assoc、array_unique 等的所有组合,但我似乎仍然没有做对。
  • 我认为没有提到的多维数组。它只是对象数组......
  • 谢谢,更新问题
  • 没有快速的方法来解决您需要循环的问题...

标签: php arrays


【解决方案1】:

您可以获得如下独特的对象

// make it json string first
$jsondata = '[{"name": "Bitcoin","symbol": "BTC"},{"name": "Ethereum","symbol": "ETH"},{"name": "Bitcoin Cash","symbol": "BCH"},{"name": "Basic Attention Token","symbol": "BAT"},{"name": "BatCoin","symbol": "BAT"}]';
// decode string to json objects which will generate like yours
$objects = json_decode($jsondata);
echo'<pre>';
// print first objects
print_r($objects);
$symbolHolder=[];
foreach ($objects as $key => $object) {
    // eliminate object from array which is identical symbol to others
    if(in_array($object->symbol, $symbolHolder))
    {
        array_splice($objects, $key,1);
    }
    array_push($symbolHolder, $object->symbol);

}
// now printing unique array of object
print_r($objects);

【讨论】:

  • 请检查这可能对你有用......让我知道它是否适合你......我得到了完美的结果
【解决方案2】:

想通了

    $unique_dict = [];
    foreach($input as $obj) {
        $symbol = $obj['symbol'];
        $unique_dict[$symbol] = $obj;
    }
    $unique_array = array_values($unique_dict);

【讨论】:

  • 如果您想用迭代时遇到的每个重复项覆盖较早的元素,则可以使用临时键——但这不是您在问题中要求的预期结果。
【解决方案3】:

您可以使用数组函数来完成这项任务。

array_column - 从数组的单列返回值,由列键标识。

array_unique - 接受一个输入数组并返回一个没有重复值的新数组。

array_intersect_key - 返回一个数组,其中包含 array1 的所有条目,这些条目的键出现在所有参数中。

例子:

<?php
$json = '[
    {"name": "Bitcoin", "symbol": "BTC"},
    {"name": "Ethereum", "symbol": "ETH"},
    {"name": "Bitcoin Cash", "symbol": "BCH"},
    {"name": "Basic Attention Token", "symbol": "BAT"},
    {"name": "BatCoin", "symbol": "BAT"}
]';

$array = json_decode($json, true);
echo json_encode(
    array_intersect_key(
        $array,
        array_unique(array_column($array, 'symbol'))
    )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多