Php 格式化数组输出以显示友好名称

Php 格式化数组输出以显示友好名称,php,arrays,symfony,Php,Arrays,Symfony,我有一个返回JSON响应的函数: public function getUsersAction() { $response = array(); $em = $this->getDoctrine()->getManager(); $entities = $em->getRepository("UserBundle:User")->findAll(); $roles = array( "ROLE_PROFILE_ONE"

我有一个返回JSON响应的函数:

public function getUsersAction()
{
    $response = array();
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository("UserBundle:User")->findAll();

    $roles = array(
        "ROLE_PROFILE_ONE" => "Facturación y Entrega",
        "ROLE_PROFILE_TWO" => "Envío",
        "ROLE_ADMIN" => "Administrador",
        "ROLE_USER" => "No posee roles asignados"
    );

    $users = array();
    foreach ($entities as $entity)
    {
        $user = array();

        $user[] = $entity->getUsername();
        $user[] = $entity->getEmailCanonical();
        $user[] = $entity->getRoles();
        $user[] = $entity->getGroupNames() != NULL ? $entity->getGroupNames() : "-";
        $users[] = $user;
    }

    $response[ 'data' ] = $users;
    return new JsonResponse($response);

}
我通过Ajax调用通过Twig模板访问它,这就是工作!现在,由于来自
User
(FOSUser)的
getRoles()
模型按照示例返回DB值:
ROLE\u PROFILE\u ONE
ROLE\u ADMIN
ROLE\u User
,我如何格式化输出以基于
$roles
定义的数组显示友好名称?我尝试在
foreach($entities as$entity)
中执行
foreach
循环,并设置了一个新数组,但由于我的Apache宕机,嵌套调用太大了。有什么帮助吗

试图通过输入/输出示例更加清晰

这就是我们的输入(函数返回的内容,我制作了一个
ladybug\u dump($entities)
来获得输出):

当我在小树枝上访问该模板时,我得到:

User1 ROLE_PROFILE_ONE
User2 ROLE_PROFILE_TWO, ROLE_PROFILE_ONE
但我需要这个输出:

User1 Facturación y Entrega
User2 Envío, Facturación y Entrega

现在更清楚了?

嗯,您已经尝试过使用嵌套循环来创建一个新数组,类似这样的情况

$users = array();
foreach ($entities as $entity)
{
    $user = array();

    $user[] = $entity->getUsername();
    $user[] = $entity->getEmailCanonical();

    $rolearray = [];
    foreach ($entity->getRoles() as $role)
    {
        $rolearray[] = $roles[$role];
    }
    $user[] = $rolearray;

    $user[] = $entity->getGroupNames() != NULL ? $entity->getGroupNames() : "-";
    $users[] = $user;
}

那就是我要做的。您可以使用
array\u map
,但我不明白为什么会有显著差异。这似乎不太可能会占用大量资源,导致服务器停机,如果发生这种情况,我会强烈怀疑还有其他问题

若您的角色总是要转换为那个些特定的字符串,那个么您可以将它们添加到您的用户模型中,并在
getTransformedRoles()
方法中构建一个角色列表,如

User.php

然后,这将返回完全转换的角色数组(使用
$user->getTransformedRoles()
),只要您需要它们,而不仅仅是单个用例

或者,您可以使用执行相同类型转换的服务,但可以通过config.yml设置一组不同的角色和转换

更新

要将此服务用作
app/config/config
中指定的角色转换,您可以执行以下操作

Acme/SomethingBundle/DependencyInjection/Configuration

Acme/SomethingBundle/DependencyInjection/AcmeSomethingExtension

然后在你的app/config/config.yml中

创建您的服务并注入角色转换

parameters:
    acme.something.role_transformer.class: Acme/SomethingBundle/Transformer/RoleTransformer

services:
    acme.something.role_transformer:
        class: %acme.something.role_transformer.class%
        arguments:
            - %acme.something.role_transformations%
然后在您的服务文件中(Acme/SomethingBundle/Transformer/RoleTransformer)

然后可以将其注入到服务或控制器中,并像

$transformer = $this->container->get('acme.something.role_transformer');
// Or injected via the DI

$roles = $transformer->getTransformedRolesForUser($user);
// For all of a users roles
$roles = $transformer->getTransformedRoles($user->getRoles());
// For an array of roles
$role = $transformer->getTransformedRole('ROLE_PROFILE_ONE');
// For a single role, or null if ROLE_USER

Symfony是否返回stdClass数组对象或PHP assocarray@NoahMatisoff关联数组:
#[roles]:数组(1)[0]:字符串(16)“ROLE\u PROFILE\u ONE”
请使用正确格式的当前数组和解决问题后所需的输出编辑op。@NoahMatisoff完成,看看我喜欢这个解决方案,这就是我将使用的,现在@Qoop我这里有一个问题,我忘了在主要帖子中提到,默认情况下,Symfony2总是,或者至少这是我认为的,分配
ROLE\u USER
,所以现在在转换的数据中,我有这样的字符串
Envío,No posee roles asignados
Envío,Facturación y Entrega,没有posee角色asignados
这是错误的,因为只有在没有角色分配给用户的情况下才会出现
没有posee角色asignados
,在这种情况下,应该使用
角色用户
,您知道如何避免或修复此问题吗?顺便说一句,感谢您的回答您可以在
getTransformedRoles
方法中捕捉到这种特殊情况(“除非角色用户是唯一的角色,否则从输出中删除角色用户”),或者调整角色,使用户不会自动分配给每个人。@Qoop在您的回答中您说过这
或者您可以使用一个服务来完成,该服务可以执行相同类型的转换,但可以通过config.yml设置一组不同的角色和转换。
您也可以使用此解决方案来改进您的回答吗为了给另一个选择?对新手来说太好了!!如果我有时间,我会的。我已经更新了。虽然它并没有真正检查过,所以它可能不会爆炸。奇怪的是,它和我做的一样,并且它关闭了我的整个Apache服务器,不管怎样,我正在尝试@Qoop方式,但也要感谢你
$rootNode
    ->children()
        ->arrayNode('role_transformations')
            ->defaultValue(array())
            ->useAttributeAsKey('name')
                ->prototype('scalar')->cannotBeEmpty()->end()
            ->end()
        ->end()
    ->end();
$container->setParameter(
    'acme.something.role_transformations', 
    $config['role_transformations']
);
// For an empty array
role_transformations: ~ // Or not even at all, it defaults to an empty array
// For transformation
role_transformations:
    ROLE_PROFILE_ONE: 'Facturación y Entrega'
    ROLE_PROFILE_TWO: 'Envío'
    ROLE_ADMIN: 'Administrador'
    ROLE_USER: 'No posee roles asignados'
parameters:
    acme.something.role_transformer.class: Acme/SomethingBundle/Transformer/RoleTransformer

services:
    acme.something.role_transformer:
        class: %acme.something.role_transformer.class%
        arguments:
            - %acme.something.role_transformations%
class RoleTransformer implements RoleTransformerInterface
{
    const ROLE_DEFAULT = 'ROLE_USER';
    protected $rolesTransformations;

    public function __construct(array $roleTransformations)
    {
        $this->roleTransformations = $roleTransformations;
    }

    public function getTransformedRolesForUser($user)
    {
        if (!method_exists($user, 'getRoles')) {
            throw new \Exception('User object has no "getRoles" method');
            // Alternatively you could add an interface to you user object specifying 
            // the getRoles method or depend on the Symfony security bundle and 
            // type hint Symfony\Component\Security\Core\User\UserInterface
        }

        return $this->getTransformedRoles($user->getRoles();
    }

    public function getTransformedRoles(array $roles)
    {
        $transformedRoles = array()

        foreach ($roles as $role) {
            $role = strtoupper($role);

            if (null !== $transformedRole = $this->getTransformedRole($role)) {
                $transformedRoles[] = $transformedRole;
            }
        }

        return $transformedRoles;
    }

    public function getTransformedRole($role)
    {
        if (self::ROLE_USER === $role) {
            return null;
        }

        if (!array_key_exists($role, $this->roleTransformations)) {
            throw \Exception(sprintf(
                'Role "%s" not found in acme.something.role_transformations', $role)
            );
        }

        return $this->roleTransformations[$role];
    }
}
$transformer = $this->container->get('acme.something.role_transformer');
// Or injected via the DI

$roles = $transformer->getTransformedRolesForUser($user);
// For all of a users roles
$roles = $transformer->getTransformedRoles($user->getRoles());
// For an array of roles
$role = $transformer->getTransformedRole('ROLE_PROFILE_ONE');
// For a single role, or null if ROLE_USER