Получить все значения с определенным значением ключа - PullRequest
1 голос
/ 13 сентября 2011

Так что я пытался понять это некоторое время и, похоже, застрял. У меня есть многомерный массив, и я пытаюсь вывести все значения с определенным ключом. Вот код:

//My Array:
$services = array(
                array(  service_name => 'facebook', 
                    service_title => 'Facebook',
                    service_order => 0, 
                    service_type => 'Social Networking'
                    ),
                array(  service_name => 'twitter', 
                    service_title => 'Twitter',
                    service_order => 0,
                    service_type => 'Social Networking'
                    ),
                array(  service_name => 'tumblr', 
                    service_title => 'MySpace',
                    service_order => 0, 
                    service_type => 'Blogging'
                    )
);

Проблема в том, что я хочу вывести значения с помощью service_type, например "Социальные сети" или "Ведение блога". Я могу сделать это, если использую оператор foreach, например:

 foreach($services as $service) {
    if ($service['service_type'] == 'Social Networking') {
             echo($service['service_title']);
    }
    if ($service['service_type'] == 'Blogging') {
             echo($service['service_title']);
    }
}

, который работает нормально, пока я не попытаюсь добавить заголовок между типами, такими как

foreach($services as $service) {
    if ($service['service_type'] == 'Social Networking') {
             echo($service['service_title']);
    }
    echo ('<h3> Blogging</h3>');
    if ($service['service_type'] == 'Blogging') {
             echo($service['service_title']);
    }
}

Я достаточно усвоил, чтобы понять, что это из-за способа работы циклов foreach, поэтому я пытался сделать это с помощью чего-то вроде while($service['service_type'] == 'Social Networking') (который создает забавный бесконечный цикл) и различными другими способами.

В идеале я хочу отсортировать массив по service_type и затем отобразить результаты без необходимости запуска цикла foreach между заголовками.

Любая помощь по этому вопросу будет отличной или даже другие предложения о том, как это сделать.

Ответы [ 3 ]

9 голосов
/ 05 июля 2014

С php> 5.5 вы можете сделать

$myData = array(
    array(
        'service_name'  => 'facebook', 
        'service_title' => 'Facebook',
        'service_order' => 0, 
        'service_type'  => 'Social Networking'
    ),
    array(  
        'service_name'  => 'twitter', 
        'service_title' => 'Twitter',
        'service_order' => 0,
        'service_type'  => 'Social Networking'
    ),
    array(
        'service_name'  => 'tumblr', 
        'service_title' => 'MySpace',
        'service_order' => 0, 
        'service_type'  => 'Blogging'
    )
);

$filtered = array_column($myData, 'service_column');

см .: http://www.php.net/manual/en/function.array-column.php

2 голосов
/ 13 сентября 2011

Я думаю, вы пытаетесь сделать что-то вроде этого:

// Create an array containing all of the distinct "service types"
// from the $services array
$service_types = array();
foreach ($services as $service) {
    // If we have not yet encountered this entry's "service type",
    // then we need to add it to our new array
    if (!in_array($service['service_type'], $service_types)) {
        $service_types[] = $service['service_type'];
    }
}
if (count($service_types)) {
    // For each "service type", we want to echo a header and then
    // a list of services of that type
    foreach ($service_types as $current_type) {
        echo '<h3>'.$current_type.'</h3>';
        // Loop through the services and echo those that are
        // of the correct type
        foreach ($services as $service) {
            if ($service['service_type'] == $current_type) {
                echo($service['service_title']);
            }
        }
    }
} else {
    echo '<h3>No services</h3>'
}
0 голосов
/ 13 сентября 2011

Я не отвечал на все ваши вопросы, но вы спросили, можете ли вы отсортировать массив по типу службы, чтобы вы могли создать определяемую пользователем функцию сортировки .

function sortByServiceType($a, $b) {  
  // This will sort them by service type alphabetically
  return strcmp($a['service_type'], $b['service_type']);
}

uasort($services, 'sortByServiceType');
...