PHP:如何比较嵌套关联数组中的值?

时间:2018-02-26 03:12:04

标签: php wordpress compare associative-array advanced-custom-fields

我正在试图解决如何实现这个目标......

我有一个类似的东西:

$contributors = array(
[0] => array(
    [name] => 'John',
    [role] => 'author',
    ),
[1] => array(
    [name] => 'Gail',
    [role] => 'author',
    ),
[2] => array(
    [name] => 'Beth',
    [role] => 'illustrator',
    ),
)

我正在尝试使用此信息构建详细的署名,例如:

  

约翰和盖尔撰写。由Beth设计。

我需要将每个role与上一个和下一个进行比较,以便:

  1. 在每个role
  2. 的第一个实例之前使用标签
  3. 使用逗号分隔同一role的多个实例
  4. 在每个role
  5. 的最后一个实例之前使用“和”而不是逗号

    我不是PHP专家,所以我很难搞清楚如何处理这个问题!我有一个函数输出正确的标签取决于role,但这是我似乎无法弄清楚的比较。我已经考虑了foreachwhile循环,但似乎都不适合这项工作。我从未使用for循环,因此我不知道它是否适用。

    一些额外的背景:

    • 我正在使用WordPress和高级自定义字段插件。
    • $contributorsACF Repeater字段的值,其中namerole是子字段。 (我简化了名称以使事情变得更容易。)

1 个答案:

答案 0 :(得分:3)

您可以按角色对数组进行分组,并使用array_pop删除元素。 implode剩余的数组元素,只需附加弹出值

$contributors = array(
    array(
        "name" => 'John',
        "role" => 'author',
        ),
    array(
        "name" => 'Gail',
        "role" => 'author',
        ),
    array(
        "name" => 'Jose',
        "role" => 'author',
        ),
    array(
        "name" => 'Thomas',
        "role" => 'author',
        ),
    array(
        "name" => 'Beth',
        "role" => 'illustrator',
        ),
    array(
        "name" => 'Mary',
        "role" => 'producer',
        ),
    array(
        "name" => 'Criss',
        "role" => 'producer',
        ),
);

//Grouped the names according to role
$grouped = array_reduce($contributors, function($c, $v) {
    if ( !isset( $c[ $v['role'] ] ) ) $c[ $v['role'] ] = array();
    $c[ $v['role'] ][] = $v['name'];
    return $c;
}, array());


//Construct final Array
$final = array();
foreach( $grouped as $key => $group ) {
    $last = array_pop( $group );

    if ( count( $group ) == 0 ) $final[ $key ] = $last; /* One one name on the role, no need to do anything*/
    else $final[ $key ] = implode( ", ", $group ) . " and " . $last;
}

echo "<pre>";
print_r( $final );
echo "</pre>";

这将导致:

Array
(
    [author] => John, Gail, Jose and Thomas
    [illustrator] => Beth
    [producer] => Mary and Criss
)

您现在可以将其用作

echo 'Written by ' . $final["author"] . '. Designed by ' . $final["illustrator"] . '. Produced by ' . $final["producer"];

并将导致:

  

约翰,盖尔,何塞和托马斯撰写。由Beth设计。由。。。生产   玛丽和克里斯